为什么会出现“无法创建pid文件…权限被拒绝”错误?


11

如果程序需要写许可,我应该如何用chown设置它?具体来说,对foo进行编程可以解决该错误的权限是什么?

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

Answers:


7

如果您有foo尝试创建/写入文件的程序,则foo二进制文件的权限无关紧要,但是运行二进制文件的用户有所不同。

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

因此,您必须按照程序运行该程序sudo foo才能创建该PID文件。请考虑在允许程序以root用户身份运行之前对安全性的影响...


如果对二进制文件的许可是什么:rw-rr那么,如果我以root身份运行程序,则该程序是否可以执行,即允许在/ var / run下创建进程ID?
Ankit 2012年

@Ankit:如果二进制文件根本没有可执行权限,它将不会“运行”;但是您以root用户身份运行的所有操作都可以在/var/run
ish

或者,将pid文件写入其他位置(许多应用程序允许您指定pid文件的路径)。
msanford

1

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

ps aux 

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

groups <username>

这将告诉您用户属于哪个组。

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

注意1:正如问题所指出的,文件位于/ var / run /中,我假设只有一个进程需要访问,如果不正确,则不应更改所有者或组,但可以考虑添加该进程'用户到该组或为此文件/文件夹创建一个新组。

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


1

我所做的只是在执行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 $?
}

是否有针对systemd的版本?
Artem Russakovskii
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.