2016-02-01 167 views
2

有沒有辦法讓後臺進程的輸出顯示在另一個進程的輸出中間?並行輸出到控制檯

我有一個腳本status_update.sh,它定期在單獨的主機上查詢某些狀態,並在更新行發生變化時打印更新行。

我想並行運行此腳本爲多個主機:

#!/bin/bash 

status_update.sh -h host1 & 
status_update.sh -h host2 & 
status_update.sh -h host3 & 
status_update.sh -h host4 & 

echo "hit any key to quit" 
read -n 1 CHAR 

killall status_update.sh 

我遇到的問題是,從一個進程更新從另一個進程的輸出中顯示出來。有沒有辦法讓輸出在不同的行上分開?

+0

另請參閱此最近的問題:http://stackoverflow.com/questions/35113225/how-to-run-a-command-in-a-bash-script-from-a-loop-with-different-arguments -simul – tripleee

回答

2

通常,確保寫入不重疊的唯一方法是使用某種類型的互斥鎖。這是一個在shell中實現的痛苦,可能不應該這樣做。相反,寫入status_update.sh以阻塞互斥體並將名稱作爲參數傳遞,然後讓status_update.sh阻止任何寫入,直到獲得互斥體。在不使用互斥鎖的情況下潛在地緩解問題的一種方法是將所有內容都管理到cat,這可以幫助確保更少的寫入系統調用(如果寫入大小爲5的20個寫入而不是1個大小爲100的寫入,則有更多機會要寫入交錯)。也就是說,嘗試:

#!/bin/bash 

status_update.sh -h host1 | cat & 
status_update.sh -h host2 | cat & 
status_update.sh -h host3 | cat & 
status_update.sh -h host4 | cat & 
+0

如果我正確地得到了你,你可以改用'stdbuf'命令。然而,最後最好將輸出存儲在每個進程的臨時文件/管道中,並在進程結束後顯示。當然,對於長時間運行的流程來說,這可能還不夠。 – hek2mgl

+0

非常感謝,'|貓沒有工作。我認爲這是因爲狀態行使用多個'printf'命令打印出來。但是,我查看了鎖文件,「flock」可以提供您推薦的互斥鎖功能。 – perogiex

1

可以使用做GNU並行給你一個名爲互斥守衛echo命令:

sem --id MyMutex echo something 

這樣只有echo一個實例可以運行一次。見here