在後台運行管道 bash 腳本

在後台運行管道 bash 腳本

我正在嘗試建立一個監視腳本來使用 netcat 監視本地主機通訊。我建立了兩個腳本,一個用於啟動監視循環,另一個用於循環本身。它們如下:

啟動文件

#!/bin/bash
netcat localhost 1099  | bash loop.sh &

迴圈語句

#!/bin/bash
while read sInput; do
     ...do something with $sInput
done

只需在沒有前台的情況下運行此應用程式就可以正常工作,但一旦我嘗試在背景執行此腳本,它就會立即從運行變為停止。有人可以告訴我為什麼會發生這種情況以及如何緩解這個問題嗎?

我的最終目標是擁有一個 bash 腳本,我可以用它來建立 arch Linux 守護程式腳本,並使一切完美運作。感謝您的幫助。

答案1

聽起來像是從標準輸入(stdin)讀取。嘗試將-d(不要嘗試從標準輸入讀取)選項新增至netcat.或在命令列上重定向:

netcat localhost 1099 <&- | bash loop.sh &

您可能還想使用它nohup來確保當/如果您在 shell 停止之前退出該 shell 時,它不會受到不利影響。

答案2

netcat 程序正在從其標準輸入讀取。由於它連接到終端,因此netcat所在的進程組(即管道)必須在前台運行。

您需要在管道的開頭插入一些東西,以發送伺服器期望的輸入。例如,對於 HTTP 伺服器,您可能有類似的東西

netcat localhost 1099 <<EOF | … &
GET HTTP/1.0 http://localhost:1099/somewhere
X-Header: wibble

EOF

如果伺服器沒有讀取任何輸入,則重定向netcat的輸入/dev/null

答案3

發現了一個實用程序,它承諾提供管道,而不需要單獨的新守護進程 bash 腳本。可能會派上用場:https://github.com/flonatel/pipexec

pipexec -- [NETCAT netcat localhost 1099]  [LOOP bash loop.sh] '{NETCAT:1>LOOP:0}'

相關內容