まあ、私が修正しようとしているプログラムがありますが、書き直すのは長い理由のために最善の選択ではありません...だから私はこの問題を修正しようとして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 }' )