優雅な方法で永遠に何もしない方法は?

優雅な方法で永遠に何もしない方法は?

stdoutに関する有用な情報を生成するだけでなく、 から読み込むプログラムがありますstdin。標準入力に何も提供せずに、その標準出力をファイルにリダイレクトしたいと思います。これまでのところ順調です。次のように実行できます。

program > output

tty では何も行いません。

しかし、問題はこれをバックグラウンドで実行したいということです。そうすると、

program > output &

プログラムは中断されます (「suspended (tty input)」)。

私が行った場合:

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 を使用すると仮定すると、ポーリングやウェイクアップは発生しないはずなので、見た目が奇妙である以外は十分なはずです)。

永久に実行され、stdout を開いたままにして、実際には stdout に何も書き込まず、stdin が閉じられても終了しないユーティリティが必要です。 のようなものは、yes実際に stdout に書き込みます。 catは、stdin が閉じられると (またはリダイレクト先が完了すると) 終了します。sleep 1000000000dは機能すると思いますが、 の方tailが明らかに優れています。私の Debian ボックスには、 コマンドをわずかに短縮する がありますtailf

別の方法として、 でプログラムを実行してみるのはどうでしょうかscreen?

答え2

sleep infinity私が知る限り最も明確な解決策です。

浮動小数点数を受け入れるinfinityので、sleep*、それは小数点16進数無限、 または非N、 によると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停止される子プロセスを非ブロッキングでエレガントに実行でき、多くのシステム コール (特にシェル) がこれを実行しますが、シグナルを発生させないシステム コールで子プロセスがブロックされるのを待つのはかなり困難です)。

関連情報