日志文件写入失败(permission denied)

用过Laravel的小伙伴一开始安装完框架后可能都遇到过daily 日志文件写入失败的问题,接下来我们就来详细说下日志文件写入失败的原因以及对应的解决方案。

在讲这个问题之前可能需要简单介绍下Linux系统下的文件的Ownership和Permission。

  • Ownership

    • User

      User是文件的所有者,默认情况下,用户创建了一个文件,该文件的所有者就是该用户。

    • Group

      一个用户组能包含多个用户,所有属于这个组的用户都有相同的权限来访问文件。假设你有一个项目,很多用户都需要访问这个项目文件的权限,你不需要手动赋予这些用户所有权限,你只需要把这些用户加到一个组里面,赋予这些组有访问文件的权限,这样一来就仅仅只有组里面的成员能对文件进行读写操作。

    • Other

      任何其他的用户都能访问文件,因此,给Other用户赋予权限,相当于所有用户都拥有这个权限。

  • Permission

    在 UNIX/Linux 系统中每一个文件和目录都有3中权限,以下就是对三个所有者的讨论。

    • Read:这个权限赋予你打开和读取文件的权限。拥有目录的读权限,你能列出其内容。
    • Write:拥有了读权限,你能修改文件的内容。拥有了目录的写权限,你能添加、移除以及重命名该目录下的文件。考虑一种场景,当你拥有文件的写权限,但是没有文件存储目录的写权限,你还是能修改文件的内容,但不能重命名、移动以及移除目录下的文件。
    • Execute:在Windows系统中,一个可执行的程序通常都有.exe后缀,你能很方便的运行它。在 UNIX/Linux 中,除非被赋予可执行权限,否则你将不能运行该程序。如果未授权可执行权限,你让然可以看并修改程序代码(被授予读和写权限),但是无法运行它。

linux下文件信息的显示截图

linux下目录的信息显示截图

以上的截图显示了一个文件和文件夹的信息,我们可以看到:

  • r 代表可读, w 代表可写, x 代表可执行。
  • 第一位文件显示 - ,文件显示 d
  • 上面第一张图片, rw-rw-r-— 中。第一组 rw- 表示文件的所有者对文件有可读、可写、不可执行的权限。第二组 rw- 表示文件所属的组内用户对该文件有可读、可写、不可执行的权限。第三组 r-— 表示其他任何用户对该文件有可读、不可写、不可执行的权限。
  • rw-rw-r-- 用二进制表示为 664 ,每一位如有权限则为 1 ,否则为 0 ,第一个三位 rw- 用二进制表示为 110 转化为十进制就是 6,后面两组依次类推,最后得到 664
  • 上面第一张图片的 dior www-data 表示该文件的所有者是 dior 用户,文件属于 www-data 组。

我们知道很多应用系统中的日志是写文件的,且是以日期来命名文件的。所以第一次创建日志的用户就显得尤为重要,如果文件创建的 OnwerGroup 不对,其他的用户触发写入日志文件就会失败。

接下来我们讨论下有多少种不同的用户可能创建日志文件:

  • Crontab中执行的定时任务,跟创建 Crontab 的用户有关,此时创建的文件 OwnerGroup 值分别是该用户以及默认的 Group
  • 一些常驻的后台进程,比如Laravel中的 queue work ,此时创建的日志文件 OwnerGroup 值分别是执行该进程的用户以及所属的默认 Group
  • 正常用户访问网站产生的日志文件,此时创建的日志文件的 OwnerGroup 都是 www-datawww-data 用户是web服务器默认的用户。

由以上的分析,我们大概已经找到了解决问题的方法。

  • 执行用户创建日志文件的权限为 664 比较恰当,这就需要当前用户的umask为 0002
  • 当前执行用户的默认 Group 应该设置为 www-data

下面就说下我的具体解决方案:

指定www-data用户执行crontab:

sudo crontab -u www-data -e

Laravel中修改创建日志文件的权限:

编辑 confog/logging.php 文件

添加 ‘permission‘ => 0664

'daily' => [
        'driver' => 'daily',
        'path' => storage_path('logs/laravel.log'),
        'level' => 'debug',
        'days' => 14,
        'permission' => 0664,
],

你有什么更好的方法么?欢迎留言!

原文地址:https://www.cnblogs.com/techcoder/p/11371744.html

时间: 2024-08-22 17:11:20

日志文件写入失败(permission denied)的相关文章

eclipse 向HDFS中写入文件报错 permission denied

环境:win7  eclipse    hadoop 1.1.2 当执行创建文件的的时候, 即: fileSystem.mkdirs(Path);//想hadoop上创建一个文件报错 报错: org.apache.hadoop.security.AccessControlException:Permission denied:user=Administrator,access=WRITE,inode="tmp":root:supergroup:rwxr-xr-x 原因: 1. 当前用户

【IOS】mac终端运行.sh文件总是提示permission denied

如果我目录jni有一个list.sh文件 我直接 nxgametekiMacBook-Air:jni luonan$  ./list.sh ../../Classes 提示 permission denied 然后 chmod +x  *.sh 然后执行就OK了 nxgametekiMacBook-Air:jni luonan$ chmod +x *.sh ./list.sh ../../Classes nxgametekiMacBook-Air:jni luonan$  ./list.sh .

iOS编译Unity3d文件报错 Permission denied

最近在尝试Unity3d的使用,毕竟Unity可以很好的编译出iOS代码,只用我们正常进行打包就好了. 这里遇到了个问题,分享一下. Archive快结束的时候,报了三个错误,类似于 /Users/sciyonSoft/Library/Developer/Xcode/DerivedData/Unity-iPhone-ghjhxtadvpljitbubdnbjvnxumck/Build/Intermediates/Unity-iPhone.build/Release-iphoneos/Unity-

Ubuntu16.04 使用sudo cat EOF 编辑文件,提示Permission denied错误的解决办法

一.执行命令报错 在Ubuntu16.04下,使用如下命令,修改hosts主机文件,居然提示权限错误: [email protected]:~$ sudo cat <<EOF > /etc/hosts127.0.0.1 localhost192.168.1.101 master1192.168.1.102 worker1192.168.1.103 worker2192.168.1.104 worker3EOF-bash: /etc/hosts: Permission denied[ema

linux root用户无法删除文件,提示permission denied

我用root用户登录,删除一个普通的文件,怎么删也删不了.最后用lsattr命令查看,原来是被保护了.lsattr查看一个文件 1. chattr权限简介 chattr - change file attributes on a Linux file system. 也就是说chattr命令的作用是改变linux文件系统中指定的文件的属性. chatrr权限是一种非常特殊的权限,它设置的属性对超级用户root也有效.只不过,它设置的属性也可以通过root来删除. 归根结底,chattr的作用是防

window 下拉取github项目失败 (Permission denied (publickey))

原因是github 帐号ssh 失效或者没有配置 1.找到gitcmd 并进入 2.在gitcmd 下切换到 安装git路劲\Git\usr\bin 3.提示在C:\Users\Administrator\.ssh 生成三个文件 4.复制id_rsa.pub 中的内容到github 5.保存即可完成.

python的配置文件读取,日志文件写入,批量写入mysql(python2.7,win7)

# -*- coding: utf-8 -*-import log_configimport ConfigParserimport pymysqllogger = log_config.getlogger('getdataabdupdata', 'getdataabdupdata.log')conf = ConfigParser.ConfigParser()conf.read("mysql.conf")user = conf.get("mysql", "u

联机重做日志文件 (转)

文章转自:http://www.cnblogs.com/kerrycode/archive/2012/08/09/2631035.html 联机日志文件又叫重做日志文件,记录了对数据库修改的信息,包括用户对数据修改和数据库管理员对数据库结构的修改.它主要用于在发生故障的时候和数据库备份文件配合恢复数据库,一般发生故障有2个情况:一个是介质损坏另外一个是用户误操作.每个数据库至少有两个日志文件组,每组至少包含1个或者多个日志成员,这里要多个日志成员的原因是防止日志文件组内某个日志文件损坏后及时提供

oracle redo 重做日志文件

以下易容翻译自oracle dba官方文档,不足之处还望指出. 管理重做日志文件 学习目标:1.解释重做日志文件的目的2.描述重做日志文件的结构3.学会控制日志切换与检查点4.多元化管理重做日志文件5.使用OMF管理重做日志文件 1.概念介绍:重做日志文件通过记录数据的所有改变情况对系统或介质故障提供恢复机制.1)重做日志文件以组的形式存在2)一个oracle数据库至少需要两组,每组至少有一文件3)在一组里的每一重做日志文件叫做成员The redo log files are used only