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