
我有一個腳本片段:
MyCoolCommand 2>&1 | tail -n 256 > "report.out" &
cool_pid=$! # FIXME
它有一個錯誤 -cool_pid
是 的 PID tail
。管道在背景運行。如何保存cool_pid
PID中的內容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
不便於攜帶。在這個方法中你可以儲存PID
MyCoolCommand
和獨立的PIDtail
。