上一個的 PID。後台管道中的命令

上一個的 PID。後台管道中的命令

我有一個腳本片段:

MyCoolCommand 2>&1 | tail -n 256 > "report.out" &
cool_pid=$!  # FIXME

它有一個錯誤 -cool_pid是 的 PID tail。管道在背景運行。如何保存cool_pidPID中的內容MyCoolCommand?外殼是/bin/sh。如果使用舊的普通 /bin/sh 是不可能的,如果有辦法實現它,我準備切換到 Bash。

答案1

在 Bash 中,您可以使用進程替換:

MyCoolCommand > >(tail -n 256 > report.out) 2>&1 &
cool_pid=$!

數據將像您的原始命令一樣從 流動到 ,但MyCoolCommand將是您想要的。tail$!

筆記:

  • 2>&1需要在之後>
  • shell 會在MyCoolCommand退出後認為工作已完成,而tail可能仍在運行。如果您的腳本在某個時刻wait用於作業然後report.out進一步處理,請記住文件可能尚未準備好。作為比較:您MyCoolCommand | tail … &被認為在之後完成兩個都進程退出。

您可以用普通的方式解決問題sh,但這需要手動管道:

mkfifo myfifo
<myfifo tail -n 256 >report.out &
MyCoolCommand >myfifo 2>&1 &
cool_pid=$!
rm myfifo

筆記:

  • 當 fifo 仍在使用時將其移除是安全的。儘管它已與目錄取消鏈接,但程式將繼續使用它。只有當 fifo 不再使用時,作業系統才會真正銷毀它。名為(如果曾經建立)的新檔案myfifo將與舊檔案(名稱除外)無關,即使舊檔案仍在使用中。

  • 如果指定的檔案myfifo已位於目前工作目錄中(因為腳本的另一個實例並行運行;或出於任何原因)並且可能正在使用,則腳本可能會出現錯誤。正確的做法是建立一個臨時目錄mktemp -d並在其中放置一個 fifo。mktemp不便於攜帶。

  • 在這個方法中你可以儲存PIDMyCoolCommand 獨立的PID tail

相關內容