为什么我会收到“无法创建 pid 文件...权限被拒绝”错误?

为什么我会收到“无法创建 pid 文件...权限被拒绝”错误?

如果程序需要写权限,我该如何使用 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可以查看服务的特定规则是否处于活动状态。

相关内容