2013-08-30 107 views
3

我發現在SE上有關於完成後臺任務時的通知以及如何在其他人結束後排隊開始工作以及像these這樣的問題的其他幾個問題,但我正在尋找一個更簡單問題的簡單答案。如何在後臺進程完成後獲取stdout消息?

我想開始一個非常簡單的後臺工作,並獲得一個簡單的標準輸出文本通知其完成。

例如:

cp My_Huge_File.txt New_directory & 

...當它完成後,我的bash shell中會顯示一條消息。這個消息可能只是完成的作業的PID,但是如果我可以爲每個後臺進程編寫獨特的消息,那也會很酷,所以我可以運行許多後臺作業而不會混淆。

感謝您的任何建議!

+2

我的Mac上的'bash'已經告訴我何時完成後臺作業。這在更新的版本中有所改變嗎? –

回答

2

你可以使用命令分組:

{ slow_program; echo ok; } & 

或等待命令

slow_program & 
wait 
echo ok 
+0

這幾乎是完美的,尤其是命令分組方法,但是在收到「OK」消息後,我必須按Enter鍵清除命令!我知道這是一個小問題,但如果在我瘋狂地輸入命令時後臺進程結束,我可以預見這可能會打斷事情。任何方式可以簡單地打印回顯消息而不需要用戶輸入? – jake9115

+1

@ jake9115它實際上並不需要使用輸入,但它會在打印提示後回顯輸出,因此看起來您沒有任何提示。你可以輸入下一個命令而不需要輸入 – user000001

4

編輯: user000001的答案與;分離的命令。我在原始示例中將命令與&&分開。我注意到的唯一區別是,如果您使用&&,則不必使用大括號將您的基地命令包圍。分號更靈活一些,所以我更新了示例。

,想到的第一件事是

{ sleep 2; echo "Sleep done"; } &

您還可以抑制來自上面的行stderr輸出隨行:

{ { sleep 2; echo "Sleep done"; } & } 2>/dev/null

如果你想保存程序輸出(stdout)到日誌文件供以後查看,您可以使用:

{ { sleep 2; echo "Sleep done"; } & } 2>/dev/null 1>myfile.log 

這裏甚至你可以使用一個通用的形式(你甚至可以使一個別名,這樣就可以在任何時間運行,而不必鍵入這麼多!):

# dont hesitate to add semicolons for multiple commands 
CMD="cp My_Huge_File.txt New_directory" 
{ eval $CMD & } 2>/dev/null 1>myfile.log 

您還可能管stdout如果您希望使用其他腳本或軟件實時處理輸出,請使用|。如果您想使用多個管道,tee也是一個有用的工具。僅供參考,I/O重定向here還有更多示例。

+0

你能指定我的命令在你的答案中的位置嗎?例如: – jake9115

+0

ex:'{cp My_Huge_File.txt New_directory;回聲「複製完成!」; }&' – collinjsimpson

1

最可靠的方法是簡單地將後臺進程的輸出轉移到臨時文件,然後使用臨時文件。

當你運行一個後臺進程可能很難捕獲輸出到一些有用的東西,因爲多個就業崗位將覆蓋海誓山盟

舉例來說,如果你有兩個過程,每個打印出的字符串中包含數字「這是我的字符串1" ,‘這是我的字符串2’,那麼有可能你用看起來像這樣的輸出結束:

‘這是mthis是我string2y字符串1’

inste廣告:

this is my string1 
this is my string2 

通過使用臨時文件,你可以保證輸出是正確的。

+0

感謝您的提示。出於這個原因,我不會嘗試將輸出打印到標準輸出,但只是想要一條消息讓我知道完成的過程。 – jake9115

0

正如我在上面的評論中提到的,bash默認情況下已經進行了這種通知,據我所知。下面是我剛剛製作的一個示例:

$ sleep 5 & 
[1] 25301 
$ sleep 10 & 
[2] 25305 
$ sleep 3 & 
[3] 25309 
$ jobs 
[1] Done     sleep 5 
[2]- Running     sleep 10 & 
[3]+ Running     sleep 3 & 
$ : 
[3]+ Done     sleep 3 
$ : 
[2]+ Done     sleep 10 
$ 
相關問題