サブシェルにネストされたコマンドのPID

サブシェルにネストされたコマンドのPID

まあ、私が修正しようとしているプログラムがありますが、書き直すのは長い理由のために最善の選択ではありません...だから私はこの問題を修正しようとして8時間を過ごしました。

この入れ子になったサブシェルコマンドから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 $!」はサブシェルでは機能しません。いたずらが、一部の親シェルecho $$; ( : ; bash -c 'echo $PPID' )のサイズが変更されました。理由?

ちなみに、これはMac上で動作するbash 3.2なので、$BASHPID最新バージョンではありません。また、ps | grep 'ffmpeg'複数のffmpegが実行されているためできません。解決策を見つけるためにインターネットを歩きました。

あなたが助けることができることを願っています。

 -Sleepless in a subshell

答え1

$!はサブシェルのpidでなければなりません。pstree -p $!必要な情報がリストにあることを確認してください。

これを解析する必要があります(おそらくawkで)、パイプの出力が画面に表示されるのとは異なります。

私のログインシェルの例です。リストに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 }' )

関連情報