为什么我的脚本在运行之前不等待网络服务启动?

为什么我的脚本在运行之前不等待网络服务启动?

我使用的是 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

相关内容