我有一个Ubuntu 14.04 LTS服务器在Supervisor下运行几个不同的程序。许多程序需要在文件系统上存储套接字和其他命名管道,/run
似乎是这些类型文件的理想选择。不幸的是,/run
是tmpfs并在每次重启时被删除,并且需要root权限来(重新)创建每个程序可以写入的目录。
我需要一种方法在/run
中创建一些子目录,并将所有者/模式设置为每个程序可以使用的内容,并在Supervisor尝试启动它们之前在每次重新启动时执行此操作。看起来Supervisor不支持在启动程序之前运行预启动命令的机制。
此类问题的大多数其他答案建议在init脚本中执行此操作,但这属于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%确定这是有效的还是理智的,但它似乎有效。是否有更清洁的方法来做这样的事情?
答案 0 :(得分:0)
您是否根据特定用户在主管下运行应用程序?因为默认情况下,应用程序以root身份运行。
我要做的是一个简单的脚本,它执行以下操作:
将此脚本放入您的超级用户配置中,而不是直接启动您的应用程序。确保它以root运行(从配置中删除用户或设置user = root)。
这样,您始终可以确保已设置环境并且目录存在。因此,如果您出于某些原因清除了tempfs,那么您的脚本仍然可以在不重新启动的情况下运行。
如果您需要在特定用户下运行您的应用程序,您可以执行以下操作: