如果程序需要写权限,我该如何使用 chown 设置它?具体来说,程序 foo 的权限是什么才能解决此错误?
failed to create pid file '/var/run/bar.pid': Permission denied
答案1
如果你有一个程序foo
试图创建/写入一个文件,foo
二进制文件的权限并不重要,但用户它正在运行一切都不同。
在这种情况下,foo
正在尝试写入/var/run
,而 拥有者为root
和仅有的可由根。
因此,您必须运行该程序才能sudo foo
创建该 PID 文件。在执行此操作之前,请考虑允许程序以 root 身份运行的安全隐患...
答案2
我所做的只是在执行 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 $?
}
答案3
一般方法:确定尝试访问文件的进程的用户和组。这通常在软件的配置中找到(例如 webservers/mailservers/...),但如果软件已在运行,请使用以下命令:
ps aux
查找您要为其配置访问权限的进程。第一列告诉您它在哪个用户名下运行。
groups <username>
这将告诉您用户属于哪个组。
更改文件的所有者或组以匹配服务。
注 1:正如问题指出文件位于 /var/run/ 中,我假设只有一个进程需要访问,如果不是这样,则您不应更改所有者或组,但您可以考虑将进程的用户添加到组或为此文件/文件夹创建一个新组。
注 2:apparmor 是一种安全系统,它可能会引发一些有趣的事情:它可以阻止进程写入它们(在文件系统级别)拥有所有必要权限的文件和文件夹。您aa-status
可以查看服务的特定规则是否处于活动状态。