當我們運行一個管道時,每個命令都在一個獨立的進程中執行。口譯員等待最後一個,但如果我們使用&符號(&)。
cmd1 | cmd2 &
進程的PID可能會接近,但我們不能認爲它是可靠的。在最後一個命令是bash保留字的情況下,它會創建一個專用的bash(這就是爲什麼您的'dir','文件'變量在done關鍵字後不會存在的原因)。示例:
ps # shows one bash process
echo "azerty" | while read line; do ps; done # shows one more bash
當第一個命令退出時,第二個命令將終止,因爲管道上的讀取返回EOF。 當第二個命令退出時,第一個命令將在試圖寫入管道時由signal SIGPIPE(在沒有閱讀器的管道上寫入)終止。但是如果命令無限期地等待......它不會被終止。
echo「$!」打印在後臺執行的最後一個命令的pid。在你的情況下,執行while循環的bash進程。
您可以使用以下語法找到「inotifywait」的pid。但它uggly:
(inotifywait ... & echo "$!">inotifywait.pid) | \
while read dir file event
do
#something
done &
cat inotifywait.pid # prints pid of inotifywait
如果你不想PID,只是可以肯定的過程將被終止,您可以中使用inotifywait的-t選項:這
(while true; do inotifywait -t 10 ...; done)| \
while read dir file event
do
#something
done &
kill "$!" # kill the while loop
無解決方案很好。你真正的成就是什麼?也許我們可以找到更優雅的解決方案。
確定$$是5431?我認爲5431就是你在管道里進入的時候。 – yaccz
我肯定希望$$低於inotifywait的pid,除非包含pid數字,然後它們會緊挨着彼此(±1)的機率很渺茫 – yaccz
非常確定,我手動鍵入'echo $$'後跟'ps'的輸出結果與發佈時一模一樣 – andrew