我创建了以下 systemd 服务来自动保持两个服务器之间的 autossh 隧道畅通:
#Systemd unit file for autossh
[Unit]
Description=Autossh Tunnel
[Service]
Type=forking
ExecStart=/usr/bin/autossh -M 20009 -f -N -L 3307:127.0.0.1:3306 remoteServer
ExecStop=pkill autossh
User=ubuntu
Group=ubuntu
UMask=0007
RestartSec=1
Restart=always
[Install]
WantedBy=multi-user.target
该文件位于/etc/systemd/system/autossh-tunnel.service
当我运行它时,我收到以下错误消息:
ubuntu@verifier:~/.ssh$ sudo systemctl daemon-reload
ubuntu@verifier:~/.ssh$ sudo service autossh-tunnel start
Failed to start autossh-tunnel.service: Unit autossh-tunnel.service is not loaded properly: Exec format error.
See system logs and 'systemctl status autossh-tunnel.service' for details.
ubuntu@verifier:~/.ssh$ systemctl status autossh-tunnel.service
● autossh-tunnel.service - Autossh Tunnel
Loaded: error (Reason: Exec format error)
Active: inactive (dead)
which autossh
产量:
ubuntu@verifier:~/.ssh$ which autossh
/usr/bin/autossh
我也尝试/usr/bin/autossh -M 20009 -f -N -L 3307:127.0.0.1:3306 remoteServer
在控制台中运行完全相同的命令,没有遇到任何问题。但是,作为 systemd 服务,它失败了。
这里出了什么问题?我有另一台具有相同设置的服务器,并且该脚本运行没有任何问题。所以我不明白这里发生了什么...
答案1
快速回答:确保检查输出/var/log/syslog
以获取详细的错误消息。
长答案:好的,我知道问题出在哪里了。
调用后不久,sudo service autossh-tunnel start
我检查了输出sudo tail -n 200 /var/log/syslog
并得到了输出:
Mar 27 20:29:01 verifier systemd[1]: /etc/systemd/system/autossh-tunnel.service:9: Executable path is not absolute: pkill autossh
Mar 27 20:29:17 verifier systemd[1]: /etc/systemd/system/autossh-tunnel.service:9: Executable path is not absolute: pkill autossh
因此我将服务文件改为调用,/usr/bin/pkill
而不仅仅是pkill
。
这确实解决了问题。现在sudo tail -n 200 /var/log/syslog
得到:
Mar 27 20:29:59 verifier systemd[1]: Starting Autossh Tunnel...
Mar 27 20:29:59 verifier systemd[1]: Started Autossh Tunnel.
并且ps aux | grep autossh
还显示它正在运行。