在 Ubuntu 20.04.2 TLS 服务器上,我需要在另一个服务完全启动后启动一个服务。具体来说,该openvpn-server
服务会创建一个tun0
IP 地址为 10.87.0.1 的接口,然后该rinetd
服务将绑定到该接口。所以rinetd
服务应该只在服务创建了该接口之后才启动。openvpn-server
rinetd
附带一个 sysvinit 服务脚本/etc/init.d/rinetd
说:
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
这导致rinetd
在系统启动期间在创建接口之前启动。 openvpn-server
然后它发出日志消息:
rinetd[792]: couldn't bind to address 10.87.0.1 port 873 (Cannot assign requested address)
并且在我手动重新启动它之前不接受连接sudo systemctl restart rinetd
,然后它运行得很好。
根据服务器进程sudo systemctl status
是openvpn
由一个名为[email protected]
. 延长Required-Start
线/etc/init.d/rinetd
说:
# Required-Start: $remote_fs $syslog openvpn-server@server
被适当地翻译systemd-sysv-generator
成另一行
[email protected]
在/run/systemd/generator.late/rinetd.service
. 但 systemd 忽略了这一点。rinetd
仍然显示相同的日志消息和故障,证明它仍然在启动之前openvpn-server
启动。
rinetd
只有在openvpn-server
服务完成其部分并创建接口之后,我才能让 systemd 可靠地启动服务?
如果我们先用systemd,我觉得直接寻址接口比较好。dev 和 sysfs 树中的设备暴露给 systemd 并且可以用来建立对其他单元的依赖。
首先屏蔽原始启动脚本。
使用实例化的.service,例如,
[email protected]
如果需要,您可以启动一个或多个实例,以拥有多个设备(前提是 rinetd 可以绑定到多个接口)。然后,您可以将服务与设备名称一起实例化:
新
.service
文件可能需要这些选项可能会令人困惑,但还有大量其他资源涵盖了类似的领域。