我正在使用在 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
我看到几个选项:
- 在安装时创建目录
- 创建要在启动时创建的所有目录的文件,然后编写一个程序来创建所有这些文件并在启动时运行它(从具有 root 权限的启动脚本)。
对此进行重复的其他选项也可以发挥作用。