Answers:
不,正确的杀死autossh方法只是杀死进程autossh,没有别的。
原因是
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
那autossh只是一个shell脚本,而不是service。它在最后一行开始一个新程序,
exec /usr/lib/autossh/autossh "$@"
再次不是服务。至于exec(您可以在Bash黑客的Wiki中再次检查它),它是一个shell-builtin命令,它用以下命令(/usr/lib/autossh/autossh "$@"在这种情况下)替换当前的shell,而无需启动新进程。因此,停止的唯一方法autossh是杀死调用脚本,例如
pkill -3 autossh
(感谢dviljoen指出使用-3标志的重要性,请参见下文)。顺便说一句,杀死ssh连接是行不通的,因为调用命令(即上面的连接)一旦意识到旧的连接已被丢弃,就会简单地启动一个新的连接。
SIGTERM是默认值,而那个是15。SIGQUIT是3,请参见superuser.com/questions/352147/what-does-kill-3-mean和en.wikipedia.org/wiki/Kill_(命令) -另外,FWIW,我刚刚检查了一下,-15但并未将其关闭,因此SIGTERM无法使用。
pkill不使用信号(= default)也不会终止autossh。
使用以下命令运行auto ssh:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
杀死它:
kill pid
BTW
pkill -9 autossh 是错的
-9确保进程不会正常退出,因此ssh当autossh进程被杀死时,该进程仍然存在
没有-9仍然是不好的,如果您有多个运行的隧道,pkill将全部杀死
正确的方法是设置AUTOSSH_PIDFILEenv var然后kill仅使用pid
我知道已经解决了这个问题,但是与上面的评论相反,using pkill -3 autossh不会杀死我的sshd子进程。
我在.bashrc文件中使用此功能。
基本上,这就像向autossh添加--kill参数。
if [ "$1" = "--kill" ]; then
ps aux |
grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
awk '{print $2}' |
xargs -r kill
else
$(which autossh) "$@"
echo "" # prevents line wrapping when you kill the ssh process
fi
您可以运行which ssh并which autossh检查系统上的路径。
只要第一个参数不是--kill,它就将args传递给autossh。
该脚本杀死autossh和ssh实例。如果您使用端口转发,这一点很重要,因为仅杀死autossh实例并不会杀死隧道,它只是防止了它在最终断开连接时重新连接。
您还可以指定搜索词(主机名)以仅杀死特定的隧道。
autossh --kill dbserver1仅杀死与dbserver1的连接
autossh --kill dbserver将杀死dbserver1,dbserver2等。
autossh --kill dbserver将杀死所有 autossh连接
为了明确起见,它应该只杀死由autossh启动的SSH会话。
如果在ps aux | grep ssh同时运行autossh和ssh会话的情况下运行,则会看到由autossh启动的会话使用完整路径(/ usr / bin / ssh和/ usr / lib / autossh / autossh)。
该脚本仅将结果与以特定路径开始的进程匹配。我这样做是因为我(而且我认为大多数人)通常会输入ssh而不是完整路径,这使它不会杀死我的常规ssh会话。
希望这对别人有帮助。
$(which autossh)而不是简单autossh吗?