为什么我得到“未能创建pid文件…权限被拒绝”错误?

如果程序需要写入权限,我应该如何设置chown? 具体来说,编程foo的权限是什么来解决这个错误?

failed to create pid file '/var/run/bar.pid': Permission denied 

如果你有一个程序foo尝试创建/写入文件, foo二进制文件的权限无关紧要,但它运行的用户会产生重大影响。

在这种情况下, foo正在尝试写入/var/run ,它由root拥有并且只能root写入。

因此,您必须以sudo foo身份运行程序才能创建该PID文件。 请考虑允许程序在执行之前以root身份运行的安全隐患…

一般方法:确定尝试访问文件的进程的用户和组。 这通常可以在软件配置中找到(例如webservers / mailservers / …),但如果软件已在运行,请使用以下命令:

 ps aux 

查找要为其配置访问权限的进程。 第一列告诉您它正在运行的用户名。

 groups  

这将告诉您用户所属的组。

更改文件的所有者或组以匹配服务。

注1:由于问题指出文件在/ var / run /我假设只有一个进程需要访问,如果不是这样,你不应该更改所有者或组,但你可以考虑添加进程’用户到组或为此文件/文件夹创建新组。

注意2:apparmor可能会发生一些有趣的事情,它是一个安全系统:它可以阻止进程写入文件和文件夹(在文件系统级别上)所有必要的权限。 使用aa-status您可以查看服务的特定规则是否处于活动状态。

我所做的只是在执行start-stop-deamon之前添加文件夹的创建。 这是有效的,因为脚本通常在启动时以root身份执行。 它只是在/ var / run中创建文件夹并立即更改所有者,因此可以写入PID。

在下面的示例中,我检查是否存在/ var / run的子文件夹,其中我将PID作为当前运行用户,在本例中为用户’pi’(因为我在树莓上)。

还要检查这个链接,因为它对我来说非常有教育意义: Python脚本作为服务运行 ,但是,它没有涵盖这里讨论的问题。

我的shell脚本的示例部分:

 # The process ID of the script when it runs is stored here: PIDFILE=/var/run/power/$DAEMON_NAME.pid do_start () { log_daemon_msg "Starting system $DAEMON_NAME daemon" if [ ! -d /var/run/power ]; then mkdir /var/run/power/ chown pi:pi /var/run/power/ fi start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chdir $DIR --startas $DAEMON -- $DAEMON_OPTS log_end_msg $? }