子 shell 中嵌套命令的 PID

子 shell 中嵌套命令的 PID

好吧,我有一个程序正在尝试修复,由于很长的原因,重写并不是最好的选择......所以,我已经花了 8 个小时试图解决这个问题,但我完全被难住了。

我试图在此嵌套子 shell 命令中获取 ffmpeg 的 PID:

(touch ~/addThumSlate.1BUSY.FILE; echo "" | ffmpeg -I "~/thumb_0011374_402.mov" "~/0011374/402_slated.mxv" > "~/0011374_402-addThumSlate1.txt" 2>&1; rm -f ~/addThumSlate1.BUSY.FILE) >/dev/null 2>&1 & echo $!

显然最后的“& echo $!”不返回ffmpeg命令的pid,并且“echo $!”在子 shell 中不起作用,我尝试乱搞,echo $$; ( : ; bash -c 'echo $PPID' )但这只是出于某种原因重新调整了父 shell?

注意,这是在 Mac 上运行的 bash 3.2,所以$BASHPID已经过时了。另外,我不能ps | grep 'ffmpeg',因为有多个 ffmpeg 正在运行。我在互联网上闲逛试图找到解决方案。

希望你能帮忙,

 -Sleepless in a subshell

答案1

$! 应该是子 shell 的 pid。尝试pstree -p $!查看您需要的信息是否在列表中。

您可能需要解析它(可能在 awk 中),并且管道的输出与您在屏幕上看到的不同。

我的登录 shell 中的示例。您应该在列表中看到一个 ffmpeg。

paul $ pstree -p $PPID | cat -vet
mate-terminal(6849)-+-bash(6856)---vi(9107)$
                    |-bash(7338)$
                    |-bash(9456)-+-cat(10573)$
                    |            `-pstree(10572)$
                    |-{dconf worker}(6855)$
                    |-{gdbus}(6854)$
                    `-{gmain}(6852)$
paul $

您可能需要从 Mac Store 下载 pstree:http://macappstore.org/pstree/

将 Pid 存储在变量中的典型 awk 结尾是:

Pid=$( pstree -p $PPID | awk -v 'RS=)' -v 'FS=(' '/ffmpeg/ { print $NF }' )

相关内容