gpt4 book ai didi

bash - 如何在 BASH 2.05 脚本中获取管道命令的 PID?

转载 作者:行者123 更新时间:2023-11-29 09:30:39 24 4
gpt4 key购买 nike

我试图在 BASH 脚本中获取管道数据收集命令的 PID,以便我可以在另一个(前台)进程完成后终止该进程。我的数据收集命令超时,但我事先不知道应该超时;从几分钟到几个小时不等。

这个问题How to get the PID of a process in a pipeline内容丰富,但没有成功。可能是因为我使用的是 BASH 2.05(在嵌入式系统上)。

jobs -p 命令在命令行上的初始测试看起来很有希望。在实践中,我将下面的 ksmon 命令替换为管道命令(ksmon | {various filters} | gzip -c > file)所以“$!"BASH 变量给出了管道中的最后一个进程,而不是我试图杀死的 ksmon 程序:

Test:/ $  ksmon > /dev/null & jobs -p
[1] 2016
2016
Test:/ $ ps | grep ksmon
2016 root 660 S ksmon
2018 root 580 S grep ksmon
Test:/ $ kill $(jobs -p)
[1]+ Terminated ksmon >/dev/null
Test:/ $ ps | grep ksmon
2021 root 580 S grep ksmon
Test:/ $

哇哦!所以我试着把它放在脚本中:

Test:/ $  cat > test.sh << EOF
> #!/bin/bash
> # That's bash 2.05
> ksmon > /dev/null & jobs -p
> EOF
Test:/ $ chmod 755 test.sh
Test:/ $ ./test.sh
Test:/ $
Test:/ $ # Nothing ...
Test:/ $ ps | grep ksmon
2025 root 660 S ksmon
2027 root 580 S grep ksmon
Test:/ $ jobs -p
Test:/ $

这是我尝试使用的版本:

Test:/ $  bash --version
GNU bash, version 2.05.0(2)-release (arm-Artila-linux-gnu)
Copyright 2000 Free Software Foundation, Inc.

奇怪的是,上面的脚本确实可以在 Ubuntu 主机上运行。

我必须做什么才能使 jobs -p 在 BASH 2.05 脚本中工作,或者是否有替代方案?

一个想法是从 $! 变量中减去一个固定的数字,但我不确定这是否是个好主意......

编辑:我想终止管道中的第一个程序的原因是管道中的所有后续程序,尤其是 gzip 将很好地关闭它们的输出流。

最佳答案

我建议你使用 $!获取管道中最后一个进程的 PID;然后 use lsof to sequentially determine previous processes in chain by open file descriptors from /proc .

关于bash - 如何在 BASH 2.05 脚本中获取管道命令的 PID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12201621/

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