我要问的是两种情况:技术上和风格上。
我的应用程序/守护程序可以在其中保存pidfile/opt/my_app/run/
吗?
这样做很不好吗?
我的需要是:我的守护程序在特定用户下运行,实现者必须在/var/run
,chown和chgrp中的mkdir新目录中运行我的守护程序。似乎仅将pidfile保留在本地(对于守护程序)似乎更容易。
Answers:
我不会将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/user
。我不记得/run
每个人都曾经写过它。但是,pidfile是/run
很常见的,它们是系统服务的规范。pidfile由以root用户身份运行的超级用户编写,或者由以root用户身份运行的启动脚本编写,然后以可能减少的特权启动实际的守护程序。
/run/user/$UID
仅在会话期间存在(用户登录时或多或少)。请使用/ tmp或〜,请参见:superuser.com/a/1127720/71795
pid文件的位置应该是可配置的。/ var / run是pid文件的标准配置,与/ var / log是日志的标准配置相同。但是您的守护程序应允许您在某些配置文件中覆盖此设置。
如果您不是以root用户身份运行脚本,则另一种约定是将pidfile放在中~/.my_app/my_app.pid
。这样比较简单,但仍然安全,因为主目录不是世界可写的。