2013-01-22 39 views
3

在後臺運行進程並僅在需要時才接收輸出的最佳方式是什麼?如何捕獲後臺進程的輸出

預期用法:使每個會話初始化具有大量初始化的提示輸出腳本,而不是在每次提示運行時進行初始化。注意:需要雙向通信:shell需要告訴何時需要新提示,最後的命令狀態是什麼。

已知的解決方案:

  • 上的文件系統的一些明確的文件(FIFO文件,Unix套接字):這將是更好的避免這種情況,因爲這意味着我需要選擇文件名,以確保它是garbage-在退出時收集並添加一些內容以清除在崩潰時不再使用的文件。
  • zsh/zpty模塊:這個工作有點像矯枉過正,並且在bash中不起作用。
  • coprocesses:不能在bash和AFAIK中工作,每個會話只允許一個協處理。

回答

1

Bash支持coprocesses sinces 4.0,但多個coprocesses仍然是實驗性的。

我會用一些明確創建的文件,如果它們是每個用戶和主機,則將它們命名爲~/.myThing-$HOSTNAME/fifo。您可以使用flock相對容易地判斷命令是否仍在運行並可以選擇啓動它:如果命令或服務器死機

(
    flock -n 123 || exit 1 
    rm/mkfifo .. 
    exec yourServer <..> .. 
) 123> ~/".myThing-$HOSTNAME/lockfile" 

,鎖自動解除,你只有幾個零長度的文件躺在附近。服務器下次啓動時,會再次刪除並設置它們。

查詢服務器會類似,但如果鎖使用而不是(並可選使用等待鎖來避免爭用),則退出。