1

我有一个 Ubuntu 14.04 LTS 服务器,在 Supervisor 下运行几个不同的程序。许多程序需要在文件系统上存储套接字和其他命名管道,并且/run似乎是这些类型文件的理想选择。不幸的是,/run每次重新启动时都会删除 tmpfs,并且需要 root 权限来(重新)创建每个程序可以写入的目录。

我需要一种方法来创建一些子目录/run并将所有者/模式设置为每个程序可以使用的东西,并在每次重新启动时在 Supervisor 尝试启动它们之前这样做。看起来 Supervisor 不支持在启动程序之前运行预启动命令的机制。

此类问题的大多数其他答案都建议在 init 脚本中执行此操作,但这属于 Supervisor 的包,我不想弄乱它(或者在上游更改时必须维护它)。

如果这台机器有 Systemd 似乎我可以使用/etc/tmpfiles.d,但事实并非如此。

我想出的最好主意是pre-start为每个程序使用单独的 Upstart 脚本,该脚本只创建目录而不实际启动任何进程。就像是:

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

4

1 回答 1

0

您是否在特定用户的主管下运行您的应用程序?因为默认情况下,应用程序以 root 作为所有者运行。

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

  1. 检查是否创建了所需的文件/文件夹。
  2. 如有必要,设置所有者。
  3. 然后启动您的应用程序

将此脚本放入您的主管配置中,而不是直接启动您的应用程序。确保它以 root 运行(从配置中删除用户或设置 user=root)。

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

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

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