Bash
如何以優雅的方式永遠不做任何事情?
我有一個程序可以產生有用的資訊,
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
)。我怎麼能做到這一點?(我在這裡優雅的主要標準:沒有臨時文件;沒有繁忙的等待或定期喚醒;沒有異國情調的實用程序;盡可能短。)
我不認為你會變得比
tail -f /dev/null
您已經建議過(假設這在內部使用 inotify,應該沒有輪詢或喚醒,所以除了看起來很奇怪之外,它應該就足夠了)。
您需要一個可以無限期執行的實用程序,它會保持其標準輸出打開,但實際上不會向標準輸出寫入任何內容,並且在標準輸入關閉時不會退出。像
yes
實際寫入標準輸出的東西。cat
將在其標準輸入關閉時退出(或您重新定向到它的任何操作完成)。我認為sleep 1000000000d
可能有效,但tail
顯然更好。我的 Debian 盒子有一個tailf
稍微縮短命令的功能。採取不同的策略,在 下執行程序怎麼樣
screen
?
sleep infinity
是我所知道的最清晰的解決方案。您可以使用
infinity
因為sleep
接受浮點數*****,它可以是十進制、十六進制、無窮大或NaN,根據man strtod
.
- 這不是 POSIX 標準的一部分,因此不如
tail -f /dev/null
. 但是,GNU coreutils (Linux) 和 BSD(在 Mac 上使用)支持它(顯然在較新版本的 Mac 上不支持 - 請參閱評論)。