模擬空的 STDIN 到分離的命令
我想在最後使用“command &”或“nohup command &”來分離命令,但它在分離後立即停止。
命令不太具體,如果它在輸入時收到 eof,它會中斷,因此 /dev/null 作為輸入將導致結束和通常有效的解決方案:
$ command < /dev/null > /dev/null 2>&1 &
不工作…
unix/linux 中是否有其他設備可以替換 /dev/null 並且表現得像空輸入,但不發送 eof。
(順便說一句,emcast這個command是非常有用的多播工具,我可以試試自己打更新檔,或者找個打更新檔的版本……不過貌似可以在外面解決)
我添加這個 EDIT 是為了讓我的問題更清楚。我製作了這個完美執行的 2 行 C 程序:程序名稱是“donothing”
#include <unistd.h> int main() { while (1) { sleep(10); } return 0; }
這就是我正在尋找的一些設備/程序,它什麼都不做,但保持其標準輸出打開。(“command & … disown” 和 “nohup command &”) 都有效。
$ donothing | mycommand >/dev/null & $ disown %1
運作良好,所以現在的問題只是:什麼 unix 設備/程序表現得像我的“什麼都不做”。
為了讓您的命令檢測
eof
,它必須從標準輸入讀取。所以大概它期待一些輸入。因此,聽起來您需要的不是空輸入(/dev/null
正是為此而生的),而是永遠不會出現的輸入。它可以用一個管道來模擬,沒有人會在另一端寫,比如:
sleep 999999999 | the-command
或者為了避免執行額外的
sleep
命令,可以使用命名管道來完成:fifo=$(mktemp -u) && mkfifo "$fifo" && (rm "$fifo" && the-command <&3 3<&- &) 3<> "$fifo"
這裡使用中間文件描述符來解決
/dev/null
當您啟動命令時 shell 將 stdin 隱式連接到的事實&
(除非您像我們這裡添加顯式的 stdin 重定向<&3
)。在 Linux 上(可能僅在 Linux 上),您還可以執行以下操作:
the-command < /dev/fd/1 3>&1 > /dev/null | :
/dev/fd/1
其中 fd 1 連接到管道,在 Linux 上,其行為類似於命名管道。也就是說,當您以讀取模式打開它時,您將獲得管道的讀取端。因此,在上面,fd 0 將連接到管道的讀取端,該管道的另一端位於 的 fd 3 上
the-command
。因為the-command
不會在其 fd 3 上寫入任何內容,所以read
對 fd 0 的任何嘗試都將阻塞(或者非阻塞讀取將返回,但沒有任何內容可讀取,或者選擇/輪詢將返回任何可讀取的內容,就像the-command
可能正在做的那樣如果它正在做任何其他事情,而不是等待永遠不會出現的輸入)。