shell - 如何在 shell 脚本中通过管道传输后台进程

标签 shell pipe background-process

我有一个 Shell 脚本,它启动一些后台进程(使用 &),并在用户调用 Ctrl+C(使用 trap)时自动终止。这效果很好:

#!/bin/sh

trap "exit" INT TERM ERR
trap "kill 0" EXIT

command1 &
command2 &
command3 &

wait

现在我想使用 grep -v "127.0.0.1" 过滤 command3 的输出,以排除所有包含 127.0.0.1 的行。像这样:

#!/bin/sh

trap "exit" INT TERM ERR
trap "kill 0" EXIT

command1 &
command2 &
command3 | grep -v "127.0.0.1" & 

wait

问题是信号 Ctrl+C 不再终止 command3。

有没有办法使用 grep 捕获管道 command3 以便能够在进程结束时终止?

谢谢

最佳答案

我会回答我自己的问题。问题在于陷阱太有限了。我更改为正确终止所有作业

#!/bin/sh

killjobs() {
    for job in $(jobs -p); do
        kill -s SIGTERM $job > /dev/null 2>&1 || (sleep 10 && kill -9 $job > /dev/null 2>&1 &)
    done
}
trap killjobs EXIT

command1 &
command2 &
command3 | grep -v "127.0.0.1" & 

wait

关于shell - 如何在 shell 脚本中通过管道传输后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65846776/

相关文章:

c - 如何使 UNIX 管道提示用户正确输入?

ios - 应用程序在后台时是否可以使用 AVAssetExportSession `exportAsynchronouslyWithCompletionHandler:` 方法?

bash - 如何使用脚本创建一个到 Stratum 的套接字?

javascript - 使用一个管道 Angular 2 在多个列上进行过滤

node.js - NPM 脚本中的跨平台管道命令

android - 在 Android 中异步发送 HTTP GET 请求的最佳方式?

react-native - 是否可以构建一个 24/7 运行在后台的 APP?

linux - 期待 bash 脚本中的命令

linux - 如何使用 sed 在两个特定字符( [ ] 括号)之间获取 shell 中的文本?

linux - 如何在 UNIX 中使用 GREP 移动特定日期的文件