Nohup

模擬空的 STDIN 到分離的命令

  • March 15, 2020

我想在最後使用“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可能正在做的那樣如果它正在做任何其他事情,而不是等待永遠不會出現的輸入)。

引用自:https://unix.stackexchange.com/questions/68246