启动时在 /var/run/ 中创建目录

启动时在 /var/run/ 中创建目录

我正在使用在 Ubuntu Server 10.04 上运行的 apache2 和 postgres。
我已经删除了这两个应用程序的启动脚本,并且我正在使用主管来监视和控制它们。我遇到的问题是,这两个目录都需要 /var/run 中的目录(为其运行的用户提供正确的权限)来存放 pid 文件。我如何在启动过程中创建它们,因为它们需要以 root 身份创建,然后 chown 给正确的用户?

编辑
最好的方法似乎是使用自定义初始化脚本创建目录。由于我根本没有 shell 脚本编写技能,我该怎么做呢?

答案1

根据Debian 政策,

/var/run并且/var/lock可以作为临时文件系统安装,因此init.d脚本必须正确处理这个问题。这通常相当于在init.d脚本运行时动态创建任何所需的子目录,而不是将它们包含在包中并依赖 dpkg 来创建它们。

显然,Ubuntu 继承自 Debian,据我所知,这一政策并没有改变。

最好的解决方案是修改新的启动脚本,以便在启动服务时,如果这些目录不存在,则会创建它们。

答案2

这种东西应该放在“/etc/rc.local”中。例子:

#!/bin/sh -e
# 
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

if [ ! -d /var/run/foo ]; then
  mkdir /var/run/foo/
  chown user1:group1 /var/run/foo/
fi
if [ ! -d /var/run/bar ]; then
  mkdir /var/run/bar/
  chown user2:group2 /var/run/bar/
fi
exit 0

答案3

回复此评论:

目前没有服务的启动脚本。 Supervisor 守护进程由 init.d 脚本启动,然后由该服务启动其他服务,该服务不应以 root 身份运行。

如果您的主管是从init.d脚本启动的,那么只需创建另一个init.d脚本,并在主管启动之前运行首选项(如何实现这一点完全取决于您的 **IX 风格)。

在其start方法中创建具有所需权限的所需目录。

在其stop方法中拆除这些目录。

答案4

我看到几个选项:

  1. 在安装时创建目录
  2. 创建要在启动时创建的所有目录的文件,然后编写一个程序来创建所有这些文件并在启动时运行它(从具有 root 权限的启动脚本)。

对此进行重复的其他选项也可以发挥作用。

相关内容