如何停止/杀死autossh隧道?


17

现在,我有了一个autossh隧道,停止它的正确方法是什么?

似乎没有简单的方法可以做到这一点。该部分的文档尚不清楚。

最简单的方法似乎是重新启动计算机?它是否正确?

Answers:


21

不,正确的杀死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连接是行不通的,因为调用命令(上面的连接)一旦意识到旧的连接已被丢弃,就会简单地启动一个新的连接。


1
实际上,您应该在不使用-9的情况下杀死autossh。如果已经通过隧道建立了连接,它将产生一个子sshd进程来处理它。用-9杀死父autossh将使sshd进程落后。在sshd进程超时之前,隧道仍将运行。如果在kill上使用默认信号(-3),它​​将正常关闭并使用它产生的sshd进程。
dviljoen

喜为-3是默认的终止信号,你实际上并不需要明确地传递-3,你可以省略
安德烈斯阿尔卡拉兹

@AndrésAlcarraz您真的确定吗?SIGTERM是默认值,而那个是15SIGQUIT3,请参见superuser.com/questions/352147/what-does-kill-3-meanen.wikipedia.org/wiki/Kill_(命令) -另外,FWIW,我刚刚检查了一下,-15但并未将其关闭,因此SIGTERM无法使用。
Daniel F

pkill不使用信号(= default)也不会终止autossh
Daniel F

@DanielF你说得对,我很困惑y中的“默认的信号(-3)”从dvijoen评论
安德烈斯阿尔卡拉兹

5

使用以下命令运行auto ssh:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

杀死它:

kill pid

BTW

pkill -9 autossh 是错的

-9确保进程不会正常退出,因此sshautossh进程被杀死时,该进程仍然存在

没有-9仍然是不好的,如果您有多个运行的隧道,pkill将全部杀死

正确的方法是设置AUTOSSH_PIDFILEenv var然后kill仅使用pid


欢迎来到超级用户。您的最后一段似乎是您的实际答案,而您问题的其余部分是对另一个答案的评论。考虑到该网站的问答性质,在您的答案中添加足够的细节将很有帮助,这样它可以独立存在。感谢您的贡献,不要忘记查看这次巡演
我说恢复莫妮卡的时间

4

搜索过程:

ps aux | grep ssh

secon列是PID号

通过PID终止进程 :)

杀死-9 PID号

如果您没有root特权,请使用sudo


1

我知道已经解决了这个问题,但是与上面的评论相反,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 sshwhich 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吗?
MestreLion
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.