这Linux 标准基础核心规范,22.4. 安装和删除初始化脚本说:
软件包安装程序将把初始化脚本安装在 /etc/init.d(可能是指向其他位置的符号链接)中。
我们遇到的情况是,由于公司政策和标准 VM 配置,我们无法使用标准软件包安装程序 (yum/rpm) 或默认位置 (/opt 等) 安装第三方应用程序。相反,应用程序必须安装在 NFS 挂载分区 (/apps) 中,这需要remote_fs
。我们仍然使用 init.d 来管理停止/启动。
未提供明确说明的相关问题:Linux 的 /etc/init.d-符号链接、硬链接还是实际文件?
有两个选项,但都存在问题:
- 将包装器文件添加到
/etc/rc.d/init.d/
。如果第三方更新包装器(这种情况经常发生)并且我们忘记更新 init.d 副本,则可能会出现问题。 /etc/rc.d/init.d/
放置一个从到目标文件的符号链接(/etc/rc.d/init.d/myapp -> /apps/myapp/bin/wrapper
)。
第二种选择存在一个问题,尽管包装器上写着:
### BEGIN INIT INFO
# Required-Start: $local_fs $network $remote_fs $syslog $time
启动时所需的内容很可能remote_fs
尚未可用,因此符号链接指向的文件无法读取 INIT INFO 块期望remote_fs
和其他服务(catch-22)。启动时报告以下错误(ps: /etc/init.d -> rc.d/init.d
):
systemd-sysv-generator[509]: stat() failed on /etc/rc.d/init.d/myapp: No such file or directory
我不是第一个遇到这个问题的人,但找不到最佳实践建议。
我正在考虑实施以下解决方法;想知道是否存在我不知道的未知后果。不要使用符号链接,而是在 处创建一个“虚拟”或“直通”包装器/etc/rc.d/init.d/myapp
。
# chkconfig: 345 75 15
# description: myapp
### BEGIN INIT INFO
# Provides: myapp
# Required-Start: $local_fs $network $remote_fs $syslog $time
# Required-Stop: $local_fs $network $remote_fs $syslog $time
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: App Description
### END INIT INFO
/apps/myapp/bin/wrapper "$@"
在停止/启动等方面似乎工作正常。与包装器的工作部分不同,不太可能改变(永远?)。
我忽略或没有考虑到的事情?