如何在每个Supervisor程序的/ run中创建一个目录?

时间:2015-07-16 15:44:55

标签: linux ubuntu supervisord upstart tmpfs

我有一个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%确定这是有效的还是理智的,但它似乎有效。是否有更清洁的方法来做这样的事情?

1 个答案:

答案 0 :(得分:0)

您是否根据特定用户在主管下运行应用程序?因为默认情况下,应用程序以root身份运行。

我要做的是一个简单的脚本,它执行以下操作:

  1. 检查是否已创建所需的文件/文件夹。
  2. 如有必要,设置所有者。
  3. 然后启动您的申请
  4. 将此脚本放入您的超级用户配置中,而不是直接启动您的应用程序。确保它以root运行(从配置中删除用户或设置user = root)。

    这样,您始终可以确保已设置环境并且目录存在。因此,如果您出于某些原因清除了tempfs,那么您的脚本仍然可以在不重新启动的情况下运行。

    如果您需要在特定用户下运行您的应用程序,您可以执行以下操作:

    1. 将前2个点移动到单独的设置脚本中(就像现在使用您的解决方案一样)。
    2. 创建另一个脚本,使用sudo调用您的安装脚本并启动您的应用程序
    3. 将您的自定义用户和脚本添加到sudo文件,以便您的用户可以在没有密码提示的情况下以root身份调用该脚本。 (请注意:如果有人访问您的服务器,则存在安全风险。请确保您的安装脚本不可写)