如何通过SSH发送SIGINT信号到远程进程?

18

我有一个运行在远程机器上的程序,该程序期望从父进程接收 SIGINT 信号。该程序需要接收该信号才能正常工作。不幸的是,如果我通过 SSH 远程运行该进程并发送 SIGINT 信号,ssh 进程本身会截获和中断信号,而不是转发给子进程。

这里有一个使用 GDB 演示此行为的示例:

本地运行:

$ gdb
GNU gdb 6.3.50-20050815 (Apple version gdb-1344) (Fri Jul  3 01:19:56 UTC 2009)
...
This GDB was configured as "x86_64-apple-darwin".
^C
(gdb) Quit
^C
(gdb) Quit
^C
(gdb) Quit

远程运行:

$ ssh foo.bar.com gdb
GNU gdb Red Hat Linux (6.3.0.0-1.159.el4rh)
...
This GDB was configured as "i386-redhat-linux-gnu".
(gdb) ^C
Killed by signal 2.
$

有人能提供一种解决这个问题的方法吗?本地 ssh 客户端是 OpenSSH_5.2p1。

4个回答

26
$ ssh-t foo.bar.com gdb ... (gdb) ^C 退出

1

在gdb提示符下尝试信号SIGINT


在我的情况下,远程程序不是GDB - 我只是用这个例子来说明行为。抱歉没有表达清楚。(实际的远程进程是一个通过标准IO下棋的服务器。)谢谢。 - Matt

1

看起来你正在执行ctrl+c操作。问题在于你的终端窗口将SIGINT信号发送到本地运行的ssh进程,而不是远程系统上的进程。

你需要在远程系统上手动指定一个信号,使用kill命令或系统调用。

或者更方便的方法是使用killall命令。

$killall -INT gdb

1
不幸的是,无论我向终端写入^C还是使用kill发送SIGINT到ssh进程,行为都是相同的。 - Matt
1
你必须向想要接收信号的进程发送SIGINT信号,而不是你的SSH会话。 - Carl Norum

0

你能在远程机器上运行终端并使用kill -INT发送信号吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接