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


73

我要问的是两种情况:技术上和风格上。

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

这样做很不好吗?

我的需要是:我的守护程序在特定用户下运行,实现者必须在/var/run,chown和chgrp中的mkdir新目录中运行我的守护程序。似乎仅将pidfile保留在本地(对于守护程序)似乎更容易。

Answers:


104

我不会将pidfile放在诸如的应用程序安装目录下/opt/my_app/whatever。该目录可以是只读的,可以在计算机之间共享,可以由守护程序监视,该守护程序会将任何更改视为可能的侵入尝试。

pidfiles的正常位置是/var/run。大多数unices会在启动时清理此目录;在Ubuntu下,这是通过/var/run内存文件系统(tmpfs)实现的。

如果您从以root用户身份运行的脚本启动守护程序,请让它创建一个子目录/var/run/gmooredaemon并将其锁定给运行守护程序的用户,然后再运行su转到该用户并启动该守护程序。

在许多现代Linux系统上,如果您从不是以root用户身份运行的脚本或启动程序启动守护程序,则可以将pidfile放入/run/user/$UID其中,这与传统用户的每用户等效/var/run。请注意,启动器的根部分或以root用户身份运行的启动脚本需要创建目录(对于人类用户,该目录是在用户登录时创建的)。

否则,请在/tmp或下选择一个位置/var/tmp,但这会增加额外的复杂性,因为pidfile的名称是否位于世界可写目录中,无法唯一确定。

在任何情况下,分发者或管理员都可以轻松地(命令行选项,也许还有编译时选项)更改pidfile的位置。


/ run现在仅可由所有者(根)写。应用程序将如何在其中写入pidfile?
TSG

@TSG现代发行版通常在中创建每个用户的目录/run/user。我不记得/run每个人都曾经写过它。但是,pidfile是/run很常见的,它们是系统服务的规范。pidfile由以root用户身份运行的超级用户编写,或者由以root用户身份运行的启动脚本编写,然后以可能减少的特权启动实际的守护程序。
吉尔斯(Gillles)“所以-别再邪恶了”

1
该答案仅部分正确:/run/user/$UID仅在会话期间存在(用户登录时或多或少)。请使用/ tmp或〜,请参见:superuser.com/a/1127720/71795
Tim

1
对于系统用户,请参阅serverfault.com/questions/779634/…–
rogerdpack

9

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


9

/ opt用于安装“自包含”应用程序,因此这里没有错。使用/opt/my_app/etc/的配置文件,/opt/my_app/log/用于记录等-共同实践这种应用。

这样,您就可以将应用程序作为TGZ文件分发,而不是为每个软件包管理器维护一个软件包(自标记以来至少为DEB ubuntu)。我建议在内部应用程序或对环境有很好控制的情况下使用此功能。这样做的理由是,如果保险柜的成本超过您放入的保险柜的成本,那是没有意义的(打包应用程序所需的工作不应超过编写应用程序所需的工作)。


6

如果您不是以root用户身份运行脚本,则另一种约定是将pidfile放在中~/.my_app/my_app.pid。这样比较简单,但仍然安全,因为主目录不是世界可写的。


1
如果每个用户都可以无冲突地运行您的应用程序实例,那将是很好的。否则,我会坚持使用/ var / run
dlite922 '16
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.