init.d 和远程文件系统

init.d 和远程文件系统

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 "$@"

在停止/启动等方面似乎工作正常。与包装器的工作部分不同,不太可能改变(永远?)。

我忽略或没有考虑到的事情

相关内容