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
*、これはおそらく少数、16進数、無限または南、によるとman strtod
。
*これはPOSIX規格の一部ではありませんtail -f /dev/null
。
答え3
sleep 2147483647 | program > output &
はい、2^31-1
数量が限られており実行されません永遠にが、ついに睡眠時間が終わったら1,000ドルを差し上げます。 (ヒント:その頃は私たちの一人が死ぬでしょう。)
- 一時ファイルの表示はありません。
- 忙しく待ったり、定期的に目覚めたりすることはありません。
- 外部ユーティリティはありません。
- できるだけ短く。さて、少し短いかもしれません。
答え4
これを行うバイナリを作成できます。
$ echo 'main(){pause();}'| gcc -Wno-all -xc - -o pause
pause
システムコールは実際には忙しい待機なしで、他のタスクの副作用で行ったり、親プロセスに知らせずに何も実行しない(またはシグナルがプロセスを終了するまで)何もしないことが唯一の目的であるシステムコールだから、これがエレガントだと思うします。 (親プロセスは子プロセスがシグナルをエクスポートするのをエレガントで非ブロック的に防ぐことができ、多くのwaitpid
(特にシェル)がこれを実行しますが、シグナルが発生していないシステムコールでサブプロセスがブロックされるのを待つのはかなり困難です。 )