好吧,我有一个程序正在尝试修复,由于很长的原因,重写并不是最好的选择......所以,我已经花了 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 }' )