我需要grep第三方程序的输出。该程序转储数据但不终止而不按^ c终止它。
我正在搜索并使用其pid查杀它。但是,我想知道是否有可能回应控制C字符。伪代码看起来像
echo ^c | ./program_that_does_not_terminate
我可以在DOS中做这样的事情,所以在linux中一定有办法。
C:\>echo y | del C:\tmp\*
C:\tmp\*, Are you sure (Y/N)? y
C:\>
答案 0 :(得分:24)
不会,将CTRL-C字符输入流程将无法正常工作,因为终端会捕获CTRL-C键并将其转换为发送给流程的终止信号。
CTRL-C的正确字符代码(ASCII格式)是代码3,但是,如果你将它回显给程序,它只会从标准输入中接收字符。它不会导致进程终止。
如果您想简化查找和终止该过程的任务,可以使用以下内容:
./program_that_does_not_terminate &
pid=$!
sleep 20
kill ${pid}
$!
将为您提供上次启动的后台流程的进程ID。
答案 1 :(得分:14)
在Bash中,可以通过编写^C
将echo
作为参数传递给命令行(并因此传递给$'\cc'
以进行回显)。因此,所需的命令是:
echo $'\cc' | ./program_that_does_not_terminate
答案 2 :(得分:2)
尝试以下方法:
expect -c "send \003;"
答案 3 :(得分:1)
我想,你需要一些更复杂的东西。如果要捕获程序的输出,则无法立即将kill信号发送到程序。与上面的示例相比,del
命令等待输入,而 CTRL + C 不是直接输入,而是终止信号。
我建议一个解决方案,您可以确定是否捕获了所有输出,然后发送了kill信号。但是,所有输出只能由您决定的时间点。
答案 4 :(得分:0)
正如@paxdiablo所说,CTRL-C按键被终端捕获并转换为发送给进程的终止信号。因此,如果您的进程连接到终端,则可以将@jwodder提供的$'\ cc'发送到该终端,让终端向该进程发送实际的终止信号。
步骤:
1。编译Execute a command in another terminal via /dev/pts中的C文件
2。sudo ./a.out -n /dev/pts/0 $'\cc'
#将/ dev / pts / 0更改为您的进程所连接的tty