글쎄요, 제가 고치려고 하는 프로그램이 있는데 다시 작성하는 것이 오랜 이유로 최선의 선택이 아닙니다... 그래서 저는 이 문제를 고치려고 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 }' )