如何優雅地永遠無所事事?

如何優雅地永遠無所事事?

我有一個程序,它可以產生有用的信息stdout,也可以從中讀取資訊stdin。我想將其標準輸出重定向到一個文件,而不在標準輸入上提供任何內容。到目前為止,一切順利:我可以做到:

program > output

並且不要在 tty 中執行任何操作。

但是,問題是我想在後台執行此操作。如果我做:

program > output &

程式將被掛起(「掛起(tty 輸入)」)。

如果我做:

program < /dev/null > output &

程序立即終止,因為它到達 EOF。

看來我需要的是透過管道輸入program一些在不確定的時間內不執行任何操作並且不讀取的內容stdin。以下方法有效:

while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &

然而,這一切都非常醜陋。那裡使用標準 Unix 實用程序,以一種優雅的方式「無限期地什麼都不做」(釋義man true)。我怎樣才能做到這一點? (我在這裡優雅的主要標準:沒有臨時文件;沒有忙等待或定期喚醒;沒有奇怪的實用程式;盡可能短。)

答案1

我不認為你會變得比

tail -f /dev/null

您已經建議了(假設這在內部使用 inotify,不應該有輪詢或喚醒,所以除了看起來很奇怪之外,它應該足夠了)。

您需要一個將無限期運行的實用程序,將保持其標準輸出打開,但實際上不會向標準輸出寫入任何內容,並且在其標準輸入關閉時不會退出。類似的東西yes實際上寫入了標準輸出。 cat將在其標準輸入關閉時退出(或您重定向到其中的任何操作完成)。我認為sleep 1000000000d可能可行,但tail顯然更好。我的 Debian 盒子有一個tailf可以稍微縮短命令的命令。

採取不同的策略,在 下運行程式怎麼樣screen

答案2

sleep infinity是我所知道的最清晰的解決方案。

您可以使用infinity,因為sleep接受浮點數*,這可能是小數,十六進位,無窮, 或者, 根據man strtod

* 這不是 POSIX 標準的一部分,因此不像tail -f /dev/null.但是,它在 GNU coreutils (Linux) 和 BSD(在 Mac 上使用)中受支援(顯然較新版本的 Mac 不支援 - 請參閱評論)。

答案3

sleep 2147483647 | program > output &

是的,2^31-1是有限數量,不會運行永遠,但當睡眠最終超時時我會給你 1000 美元。 (提示:到那時我們中的一個人就會死了。)

  • 沒有臨時文件;查看。
  • 沒有忙等待或週期性喚醒;查看
  • 沒有外來的公用事業;查看。
  • 盡可能短。好吧,還可以再短一點。

答案4

您可以建立一個可執行此操作的二進位檔案:

$ echo 'main(){pause();}'| gcc -Wno-all -xc - -o pause

我覺得這很優雅,因為pause系統調用實際上是一個系統調用,其唯一目的是永遠不執行任何操作(或直到信號殺死進程)而無需忙等待,將其作為其他操作的副作用或不告訴父進程(父進程可以優雅地非阻塞地阻止waitpid其子進程發出信號,許多(尤其是 shell)都這樣做,而等待子進程在非信號引發的系統調用中被阻塞則相當困難) 。

相關內容