Answers:
如果您有foo
尝试创建/写入文件的程序,则foo
二进制文件的权限无关紧要,但是运行二进制文件的用户会有所不同。
在这种情况下,foo
正在尝试写入/var/run
,它由root拥有root
并且只能由root写入。
因此,您必须按照程序运行该程序sudo foo
才能创建该PID文件。请考虑在允许程序以root用户身份运行之前对安全性的影响...
/var/run
通用方法:确定尝试访问文件的用户和进程组。通常可以在软件的配置中找到它(例如webservers / mailservers / ...),但是如果软件已经在运行,请使用以下命令:
ps aux
查找您要为其配置访问权限的过程。第一列告诉您正在运行哪个用户名。
groups <username>
这将告诉您用户属于哪个组。
更改文件的所有者或组以匹配服务。
注意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 $?
}