分页: 1 / 1

系统启动时systemd的与网络有关的问题求助

发表于 : 2019-11-07 16:15
xhsh
我想在系统启动时让系统自动建立到一个服务器的反向隧道,首先创建了/etc/systemd/system/autossh.service文件,其内容为:

[Unit]
Description= autossh

[Service]
ExecStart=/bin/sh /usr/local/bin/autossh.sh
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
After=network-online.target
Wants=network-online.target

其中要执行的脚本/usr/local/bin/autossh.sh里的命令是:

/bin/su -c 'ssh -CNfg -R 3583:127.0.0.1:22 xhsh@192.168.1.3' - xhsh

测试时,直接运行systemctl start autossh.service成功,可以在实现在服务器上通过端口3583实现反向登陆我自己的机器。然而重启机器时,则提示Network is not reachable. 我怀疑是因为在启动这个服务时,系统网络还没准备好。请问After=和Wants=后面怎么写才能在系统的网络准备好后才开始启动这项服务?或者,systemd最后启动的服务是什么,以便我能把我的autossh服务放在systemd中的最后一个启动?谢谢!

Re: 系统启动时systemd的与网络有关的问题求助

发表于 : 2019-11-07 18:06
astolia
你还没有启用吧

代码: 全选

sudo systemctl enable autossh
启动顺序可以用systemd-analyze看

代码: 全选

systemd-analyze plot > a.svg
还有After在[Install]里是无效的,该写到[Unit]里

Re: 系统启动时systemd的与网络有关的问题求助

发表于 : 2019-11-08 9:11
xhsh
astolia 写了: 2019-11-07 18:06 你还没有启用吧

代码: 全选

sudo systemctl enable autossh
启动顺序可以用systemd-analyze看

代码: 全选

systemd-analyze plot > a.svg
还有After在[Install]里是无效的,该写到[Unit]里
非常感谢,确实问题出在After=的位置不对,应该放在[Unit]里,完整的正确的文件是:

[Unit]
Description= autossh
After=NetworkManager-wait-online.service
Wants=NetworkManager-wait-online.service

[Service]
ExecStart=/bin/sh /usr/local/bin/autossh.sh
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

不过现在找到了一个办法,可以不要After=和Wants=了,只要在要执行的脚本文件/usr/local/bin/autossh.sh第一行前面插入sleep 120,等待两分钟,然后再开始执行下面的命令,这时候,网络就已经准备好了,就可以通过ssh登陆其它服务器了。原因是,由systemd管理的各个service默认都是同步启动,除非里面有After=和Required=等语句改变某些service的先后顺序。当在脚本中加入sleep 120,网络启动的service和自定义的autossh.service同步启动,但等脚本中的sleep命令执行完毕,网络早已经启动起来了。

推荐的systemd-analyze命令确实可以看到启动的先后顺序,非常感谢。