如何终止管道命令?

如何终止管道命令?

假设有一个名为的简单脚本action.sh

#!/bin/bash
echo -n 'a' | nc a.b.c.d p

动作.sh这里放置一个a要寻址的字符a.b.c.d

但是,nc有时会挂起,我想杀死它:

$ ./action.sh
^C

这工作正常,没有僵尸留下。

当我将其放入后台并尝试终止它时,它nc保持活动状态,我需要手动清理:

& ./action.sh &
[1] 28747
& kill -15 28747 //here nc is still running! I have to find its PID and terminate it

有没有办法在收到终止信号时也要求action.sh终止?nc

答案1

#!/bin/bash

trap ctrl_c INT

function ctrl_c() {
    # redirect to stderr to avoid showing errors in case nc isn't found
    kill -9 $(pgrep nc) > /dev/null 2>&1
}

echo -n 'a' | nc a.b.c.d p

答案2

这也可以通过kill如下调用来实现:

kill 15 -28747

15是终止信号(使用 9 表示终止),并且28747是我问题中父进程的PID。

相关内容