我的 pidfile 必须位于/var/run 中吗?

我问的是两种情况: 技术上和文体上。

我的应用程序/守护进程可以在 /opt/my_app/run/中保存一个 pidfile 吗?

这样做很糟糕吗?

我的需要是这样的: 我的守护进程在一个特定的用户下运行,并且实现者必须在 /var/run、 chown 和 chgrp 中创建一个新目录来运行我的守护进程。保持 pidfile 本地(对于守护进程)似乎更容易。

66890 次浏览

Pid 文件的位置应该是可配置的。/var/run 是 pid 文件的标准,与/var/log 是日志的标准一样。但是您的守护进程应该允许您在某个配置文件中覆盖此设置。

/opt 用于安装“自包含”应用程序,因此这里没有错误。对配置文件使用 /opt/my_app/etc/,对日志使用 /opt/my_app/log/等等——这种应用程序的常见做法。

在这种情况下,您可以将应用程序作为 TGZ 文件分发,而不必为每个包管理器维护一个包(自从您标记了 ubuntu以来,至少是 DEB)。对于内部应用程序或对环境有很好控制的情况,我建议使用这种方法。其原因是,如果保险箱的成本高于您放入其中的成本(打包应用程序所需的工作不应该超过编写应用程序所需的工作量) ,这是没有意义的。

我不会将 pidfile 放在诸如 /opt/my_app/whatever之类的应用程序安装目录下。这个目录可以挂载为只读,可以在机器之间共享,可以由守护进程监视,该守护进程将那里的任何更改视为可能的入侵尝试..。

Pidfiles 的正常位置是 /var/run。大多数 unice 会在引导时清理这个目录; 在 Ubuntu 下,这是通过 /var/run内存文件系统(tmpfs)实现的。

如果您从作为 root 用户运行的脚本启动守护进程,那么让它创建一个子目录 /var/run/gmooredaemon,并在 suing 给运行守护进程的用户并启动该守护进程之前,将其显示给运行该守护进程的用户。

在许多现代 Linux 系统中,如果您从一个不以 root 运行的脚本或启动程序启动守护进程,您可以将 pidfile 放在 /run/user/$UID中,这是传统 /var/run的每个用户等价物。注意,启动程序的根部分或作为根运行的引导脚本需要创建目录(对于人类用户,该目录是在用户登录时创建的)。

否则,在 /tmp/var/tmp下选择一个位置,但这会带来额外的复杂性,因为如果 pidfile 位于世界可写目录中,则不能唯一地确定它的名称。

无论如何,让分发服务器或管理员更容易地更改 pidfile 位置(命令行选项,可能还有编译时选项)。

另一个约定是,如果不以 root 身份运行脚本,则将 pidfile 放在 ~/.my_app/my_app.pid中。这种方法更简单,同时仍然是安全的,因为主目录是不可写的。