永遠に何もエレガントにしない方法は何ですか?

永遠に何もエレガントにしない方法は何ですか?

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私が知っている最も明確な解決策です。

ワゴンが許可されているため使用できますinfinitysleep*、これはおそらく少数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(特にシェル)がこれを実行しますが、シグナルが発生していないシステムコールでサブプロセスがブロックされるのを待つのはかなり困難です。 )

関連情報