分类: 系统运维
2013-01-31 14:39:45
通过ssh连接的服务器, 运行某个长时间运行的程序时, 通过Ctrl-c就可以杀掉进程.
但如果是程序后台ssh到服务器, 则不容易发送Ctrl-c, 找了很久后, 发现一个国际友人也有此一问.
测试后, 发现可用, 就翻译一下, 有错误的地方, 请多海涵.
原文地址:
方法二:
通过连接另外一个SSH, 我们可以查询出前一个SSH客户端的进程, 然后杀掉, 这个方法也是可行的.
命令1 : 找到控制台的编号( 在第一个控制台上执行 ):
w |awk '{print $2,$8}'|grep -w w|awk '{print $1}'
命令2 : 杀掉前一个控制台上的进程( 在第二个控制台上执行 ):
ps aux|grep -v 'grep\|sshd\|bash' |grep ' 控制台号(如pts/2) '|awk '{print $2}'|xargs kill
方法一:
举个例子 在控制台上执行如下命令:
Short answer:
ssh -t fs "stty isig intr ^N -echoctl ; trap '/bin/true' SIGINT; sleep 1000; echo f" > foo
执行后, 用Ctrl+N杀掉
and stop the program by CTRL+N.
解释一下:
Long explanation:
1 你必须使用stty的intr参数来改变你服务器或本地的interrupt character.
在上面的命令中, 作者改变服务器的interrupt character为Ctrl+N
(译者: 你也可以定义其他字符,不用Ctrl也可以). 你也可以改变你本地的interrupt
character, 同时保留服务器上原有的interrupt character.
2 使用stty的-echoctl参数: 如果你不希望interrupt character出现在你的
output中(也包括其他控制类符号), 就使用-echoctl
3 stty isig: 你必须保证control characters被服务器的sshd转发到bash.
如果没做到,你只能在logout之后,才能结束掉已经挂起的进程了.
4 用trap '/bin/true' SIGINT捕获SIGINT信号. 没有trap, 在SIGINT signal发出后,
将没有任何stdout输出.
1 You must use stty option intr to change your server or local
interrupt character to not collide with each other.
In the command above I've changed the server interrupt character to CTRL+N.
You can change your local interrupt character and leave the server's one
without any changes.
2 If you don't want the interrupt character to be in your output (and any other control
character) use stty -echoctl.
3 You must assure that control characters are switched on the server bash
invoked by sshd . If you don't you can end up with processes still
hanging around after you logout. stty isig
4 You actually catch SIGINT signal by trap '/bin/true' SIGINT
with empty statement. Without the trap you will not have any stdout
after SIGINT signal on your end.