systemd 服务没有执行脚本?

systemd 服务没有执行脚本?

我使用的是 Debian 9.11 系统。我遇到了一个问题,systemd 服务运行我的脚本但没有产生预期的结果。

我创建了一个名为的脚本my_autossh.sh并将其放在下/usr/bin。脚本内容如下。

autossh -f -n -T -N -o "ServerAliveInterval=60" -D 7070 [email protected]

然后我创建了一个名为的文件my_autossh.service并将其放在 下/etc/systemd/system。文件内容如下。

[Unit]
Description=autossh connection with www.abc.com for VPN service

[Service]
Type=simple
ExecStart=/bin/bash /usr/bin/my_autossh.sh

[Install]
WantedBy=multi-user.target

然后我通过执行以下操作授予两个文件的执行权限

sudo chmod +x /usr/bin/my_autossh.sh
sudo chmod +x /etc/systemd/system/my_autossh.service

然后尝试通过执行启动服务

sudo systemctl enable my_autossh.service
sudo systemctl start my_autossh.service

运行sudo systemctl status my_autossh.service返回以下结果

● my_autossh.service - 与 www.abc.com 建立 autossh 连接以用于 VPN 服务
服务已加载:已加载(/etc/systemd/system/my_autossh.service;
已启用;供应商预设:已启用)
活动:自 2020-01-16 星期四 11:24:09 CST;6 分钟前起处于非活动状态(已死亡)
进程:8196 ExecStart=/bin/bash /usr/bin/my_autossh.sh(代码=exited,状态=0/SUCCESS)
主 PID:8196(代码=exited,状态=0/SUCCESS)

1 月 16 日 11:24:09 tlt-p003 systemd[1]: 已启动与 www.abc.com 的 autossh 连接以使用 VPN 服务。1
月 16 日 11:24:09 tlt-p003
autossh[8214]: 正在启动 ssh(计数 1)

但是当我运行ps aux | grep检查 autossh 是否正在运行时,它没有运行。运行/usr/bin/my_autossh.sh确实启动了 autossh。为什么?

答案1

如果您使用 运行 systemd Type=simple,那么您需要在前台运行该服务,这意味着它应该在服务处于活动状态时阻塞,而不是分叉后台守护进程并退出。

autossh-f选项将其置于后台,因此它执行的操作与您想要的相反。删除该选项,它应该可以正常工作。

此外,您需要使用命令从 shell 脚本启动 autossh exec,该命令将在同一进程中用 autossh 替换 shell。这使得 autossh 成为 systemd 的直接子进程,因此每当 systemd 尝试与其交互时(例如,在尝试停止它时向它发送信号),它都会直接向 autossh 进程发送信号,而不是向运行它的 shell 发送信号。

综上所述,您应该修改您的 shell 脚本如下:

exec autossh -n -T -N -o "ServerAliveInterval=60" -D 7070 [email protected]

请注意,您实际上不需要为该命令行使用单独的 shell 脚本,它不使用 systemd 中不支持或以不同方式工作的 shell 的任何功能...因此,您可以直接在ExecStart=单元文件中使用它:

[Service]
Type=simple
ExecStart=/usr/bin/autossh -n -T -N -o "ServerAliveInterval=60" -D 7070 [email protected]

相关内容