![为什么我的脚本在运行之前不等待网络服务启动?](https://linux22.com/image/9246/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%E8%84%9A%E6%9C%AC%E5%9C%A8%E8%BF%90%E8%A1%8C%E4%B9%8B%E5%89%8D%E4%B8%8D%E7%AD%89%E5%BE%85%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1%E5%90%AF%E5%8A%A8%EF%BC%9F.png)
我使用的是 Debian 8,并配置了一个脚本并将其放在 /etc/init.d 目录下,如下所示。基本上,我想在启动时打开 ssh 隧道。
#! /bin/sh
# /etc/init.d/open_tunnels
### BEGIN INIT INFO
# Provides: open_tunnels
# Required-Start: $network $syslog $remote_fs
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
case "$1" in
start)
echo "Running open_tunnels..."
<ssh command>
;;
stop)
killall open_tunnels
;;
*)
echo "Usage: /etc/init.d/open_tunnels start"
exit 1
;;
esac
exit 0
然后我添加了该服务
insserv open_tunnels
但是,当我启动系统时,我在系统日志中看到以下内容:
open_tunnels[522]: ssh: connect to host <IP> port 22: Network is unreachable
我确信 ssh 命令运行良好,因为我在我的系统上使用它(登录后)。我只是希望它在启动时执行。
我在这里缺少什么吗?
答案1
读https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/以便对此事进行彻底的处理。你的主要问题是这样的:
到底需要什么
$network
并不明显,并且根据本地配置可能会有所不同。
Systemd 为您提供了更好的工具,如上面的链接所述。基本上,你会想要把
[Unit]
Require = network-online.target
After = network-online.target
在您的自定义服务文件中,并希望您的网络管理服务提供良好的network-online.target
.
如果您不想用 systemd 服务文件替换 init 脚本,请创建目录/etc/systemd/system/open_tunnels.service.d
并将上述 3 行放入.conf
该目录中的任何文件(带扩展名)中。这将增强由 systemd 的 SysV init 兼容层自动生成的服务描述,如 中所述man systemd.unit
。