我有一个Ubuntu 14.04 LTS服务器在Supervisor下运行几个不同的程序。许多程序需要在文件系统上存储套接字和其他命名管道,而/run
似乎是这些类型文件的理想选择。不幸的是,/run
是tmpfs,在每次重新启动时都被删除,并且需要root权限来(重新)创建每个程序可以写入的目录。
我需要一种方法在/run
中创建几个子目录,并将所有者/模式设置为每个程序可以使用的东西,并在每次重新启动之前这样做主管试图启动它们。看起来Supervisor不支持在启动程序之前运行预启动命令的机制。
对于这类问题的大多数其他答案建议在初始化脚本中进行,但这属于Supervisor的包,我不想弄乱它(或者当它在上游更改时必须维护它)。
如果这台机器有Systemd,似乎我可以使用/etc/tmpfiles.d
,但它没有。
我想到的最好的主意是为每个程序使用单独的Upstart pre-start
脚本,它只创建目录而不实际启动任何进程。比如:
/etc/init/myapp1.conf
start on runlevel [2345]
pre-start script
mkdir -p -m 0755 /var/run/myapp1
chown app1user: /var/run/myapp1
end script
…没有任何exec
线。我不能100%确定这是有效的或理智的,但它似乎是有效的。有没有更干净的方法来做这件事?
您的应用程序是否在特定用户的监督下运行?因为在默认情况下,应用程序是以root作为所有者运行的。
我要做的是一个简单的脚本,它做以下事情:
- 检查是否创建了所需的文件/文件夹。
- 必要时设置所有者。
- 然后启动应用程序
把这个脚本放到你的supervisor配置中,而不是直接启动你的应用程序。确保它是在root下运行的(从配置中删除user或设置user=root)。
这样您就可以始终确保您的环境已经设置好,并且您的目录已经存在。因此,如果您出于某些原因清除了temps,您的脚本仍将运行而无需重新启动。
如果你需要在一个特定的用户下运行你的应用程序,你可以这样做:
- 将前2点移动到单独的设置脚本中(就像您现在使用解决方案一样)。
- 创建另一个脚本,使用sudo调用您的设置脚本并启动您的应用程序 将您的自定义用户和脚本添加到sudo文件中,以便您的用户可以以root身份调用该脚本,而无需提示密码。(请注意:如果有人访问您的服务器,这是一个安全风险。确保你的设置脚本是不可写的)