gpt4 book ai didi

bash - 当在标准错误中看到特定字符串时,如何终止进程?

转载 作者:行者123 更新时间:2023-11-29 08:52:40 24 4
gpt4 key购买 nike

我需要启动一个进程,比方说 foo。我希望看到 stdout/stderr 正常,但是 grep 字符串 bar 的 stderr。一旦在 bar 中找到stderr foo 应该被杀死。

这可能吗?

最佳答案

我最初写了一种涉及流调配的方法来执行此操作,但效果不是很好。一些评论与该版本有关。如果您好奇,请查看历史记录。

这里有一个方法可以做到这一点:

(PIDFILE=$(mktemp /tmp/foo.XXXXXX) && trap "rm $PIDFILE" 0 \
&& { foo \
2> >(tee >(grep -q bar && kill $(cat $PIDFILE)) >&2) \
& PID=$! && echo $PID >$PIDFILE ; wait $PID || true; })

很好的老式噩梦燃料。这里发生了什么?

  1. 最外层的括号将整个内容放在一个子外壳中;出于卫生目的,这限制了变量的范围
  2. 我们使用适用于 GNU 和 BSD mktemp 的语法创建一个临时文件,并将其命名为 PIDFILE
  3. 我们设置了一个包罗万象的退出陷阱(当最外层的子 shell 退出时运行)以删除由 PIDFILE 命名的文件,再次用于 hygeine
  4. 我们运行foo;这是在复合语句中完成的,因此 & 绑定(bind)到 foo 而不是整个前面的管道
  5. 我们将 foo 的标准错误重定向到等待 bar 出现然后杀死 foo 的进程替换(稍后会详细介绍) )
  6. 我们捕获foo的PID到一个变量中,写入到PIDFILE命名的文件中,然后等待它,这样整个命令就等待foo 在自己退出之前退出; || true 在发生这种情况时丢弃 foo 的错误退出状态。

进程替换中的代码如下:

  1. 首先,tee输入(foo的标准错误),将tee的标准输出重定向到标准错误,这样foo的标准错误确实出现在标准错误上
  2. 将输入的副本发送到另一个进程替换的文件 (a process substitution within a process substitution)
  3. 在更深层次的进程替换中,首先在输入上运行grep -q,查找指定的模式,并在找到它时(或到达流的末尾时)立即退出), 不打印任何东西,之后(如果找到字符串并成功退出)shell 继续...
  4. kill 捕获PID在PIDFILE文件中的进程,即foo

关于bash - 当在标准错误中看到特定字符串时,如何终止进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14093878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com