systemd 服务产生 Exec 格式错误

systemd 服务产生 Exec 格式错误

我创建了以下 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还显示它正在运行。

相关内容