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
停止される子プロセスを非ブロッキングでエレガントに実行でき、多くのシステム コール (特にシェル) がこれを実行しますが、シグナルを発生させないシステム コールで子プロセスがブロックされるのを待つのはかなり困難です)。