我正在尝试编写一个跨平台的 sysvinit 服务,该服务可以在尽可能多的 sysvinit 系统上运行。
我需要的东西:
该进程需要守护进程(运行时不会自动守护进程)
进程崩溃时需要重新启动
我通过使用start-stop-daemon
命令实现了守护进程 - 但我了解到这可能并不总是存在。是否有更标准的方法来实现start-stop-daemon
跨平台的功能?
我还需要确保进程在崩溃时自动重新启动...实现这一目标的最佳且最跨平台的方法是什么?
该命令是否也可能update-rc.d
并不总是存在?如果是这样,我应该用什么代替?
这是到目前为止我的 sysvinit 脚本:https://gist.github.com/banister/40775de6a3778e1439d2f776d290073d
谢谢!
答案1
一能编写 van Smoorenburgrc
脚本来执行此操作。它们最终成为脚本中每个单独步骤的case
……构造。esac
这是无法维护的。
这是该机制的已知问题之一。
除此之外,van Smoorenburgrc
脚本多年来一直不是在 Ubuntu 和 Fedora 中执行操作的方式。在这两种情况下,在他们使用 systemd 之前,他们都有 Upstart。事实上,rc
systemd 中的 van Smoorenburg 兼容性在 Arch Linux 中被关闭。认为 van Smoorenburgrc
脚本是某种所有人都可以运行的通用最低限度甚至忽略辅助命令的变化是一个彻头彻尾的错误。你的目标是错误的。
为了大致了解在为所有风格编写单个脚本时必须满足的广泛差异,请考虑自 2014 年以来,编写 van Smoorenburgrc
脚本的 Debian 方式现在记录如下:
#!/lib/init/init-d-script ## 开始初始化信息 # 提供:myvpn # 必需启动:$network $local_fs $remote_fs # 必需停止:$network $local_fs $remote_fs # 默认开始:2 3 4 5 # 默认停止:0 1 6 # 简短描述:我的 VPN 服务 # 描述:该脚本启动 MY VPN 守护进程 ### 结束初始化信息 DAEMON=/opt/myvpn/bin/myvpn-daemon 名称=我的VPN 导出 LD_LIBRARY_PATH=/opt/myvpn/lib
这比您的脚本短得多,这里有额外内容的空间。以一个粗略的 systemd 服务单元为例……
% cat myvpn.service [单元] 描述=我的 VPN 服务 [服务] ExecStart=/opt/myvpn/bin/myvpn-daemon 环境=LD_LIBRARY_PATH=/opt/myvpn/lib 重新启动=始终 [安装] WantedBy=多用户.target %
...并将其转换...
%系统控制转换systemd-units --no- Generation-comment ./myvpn.service %
...显示了 daemontools 系列服务定义(在本例中使用 nosh 工具集)也是什么样子:
% 系统控制打印服务脚本 ./myvpn 开始:#!/bin/nosh 开始:真 停止:#!/bin/nosh 停止:真 运行:#!/bin/nosh 运行:#我的VPN服务 运行:移动到控制组../myvpn.service 运行:getuidgid 运行:userenv-fromenv 运行:setenv LD_LIBRARY_PATH /opt/myvpn/lib 运行:chdir / 运行:/opt/myvpn/bin/myvpn-daemon 重新启动:#!/bin/sh 重新启动:睡眠0.1 restart:exec true # 忽略脚本参数 %
Daemontools 系列服务管理器可以在非 Linux 操作系统上运行,自动重启甚至是这个世界的默认设置。
进一步阅读
- /etc/init.d/骨骼在哪里?
- https://unix.stackexchange.com/a/202731/5132
- 乔纳森·德博因·波拉德 (2015)。System 5 的已知问题
rc
。经常给出的答案。