在 Ubuntu 上:
touch: cannot touch `/var/run/test.pid': Permission denied
我正在启动 start-stop-daemon,并喜欢将 PID 文件写入 /var/run start-stop-daemon 以 my-program-user 身份运行
/var/run setting is drwxr-xr-x 9 root root
我想避免将 my-program-user 置于 root 组中。
答案1
默认情况下,您只能以有效用户 ID 为 0 的用户(即 root 用户)写入 /var/run。这是有充分理由的,因此无论您做什么,都不要去更改 /var/run 的权限...而是以 root 身份创建一个目录在下面/var/运行:
# mkdir /var/run/mydaemon
然后将其所有权更改为您希望运行流程的用户/组:
# chown myuser:myuser /var/run/mydaemon
现在指定使用 /var/run/mydaemon 而不是 /var/run。
您可以随时以相关用户的身份运行测试来测试这一点。
答案2
mkdir /var/run/mydaemon
chown myuser:myuser /var/run/mydaemon
这将不起作用,因为它将在下次重启时丢失(/var/run
在 Ubuntu 上是 tmpfs)。
唯一可行的解决方案是将 mkdir 和 chmod 作为启动脚本的一部分运行。
答案3
在 systemd 管理的发行版(例如 Ubuntu)中,不需要任何权限,并且不需要任何权限。
在这样的系统上,根据设计,所有可能需要此类访问权限的非交互式服务要么从 root 拥有的进程启动,要么使用每个用户的运行时目录。所有权限问题都可以且将由管理器服务处理。
任何系统级程序都不会直接写入/run
,而是由系统管理器为其配置一个可写目录,只有后者才有权限这样做。文件中的相关配置identifier.service
如下
[Service]
RuntimeDirectory=identifier
当作为系统服务启动时,/run/identifier
将创建一个目录。或者,当从非 root 用户启动时,将创建一个目录/run/[UID]/identifier
。默认情况下,这两个目录都设置为同时启动的程序能够写入其中,并通过提供环境变量与启动的程序进行通信RUNTIME_DIRECTORY
。
答案4
那么在 /var/run 上使用“粘性”位怎么样?
修改配置文件 +t /var/run ?
可能会搞乱一些其他应用程序,但这似乎是另一种解决方案。
不过,我现在坚持创建一个单独的 /var/run 文件夹。