less(1)
私たちの会社の本番サーバーでコマンドのタイムアウトを設定したいと思います。毎日大きなログファイルを作成し、毎晩アーカイブ/削除するバッチジョブがありますが、(長期)実行プロセスがブロックされる可能性があるため、ディスク使用率が高いという警告が表示されることがあります。ファイルはunlink(2)
参照によって物理的に-ed - POSIXファイルシステムの意味論的数。
これらの迷惑の最も一般的なケースを避けるために、私はless
それを実行するラッパーを作成しました。timeout(1)
less
ファイルシステムに開かれたファイルを残すことなく、数時間後にアイドルプロセスが自動的に終了します。
しかし、結果は誤動作します。コマンドがman(1)
環境変数を介してラッパーを開始すると、キーボード入力への応答が停止します。以下は、再現可能な最小限のテストケースです。man
PAGER
$ PAGER='timeout 12h /bin/less' man man
実行後のps fx
出力は次のようになります。
19415 pts/1 SNs 0:00 \_ -bash
19854 pts/1 SN+ 0:00 \_ man man
19867 pts/1 SN 0:00 \_ timeout 12h /bin/less
19869 pts/1 TN 0:00 \_ /bin/less
私はkill -KILL 19869
ターミナルに再びアクセスすることができました。
私がここで何を間違っているのか?less
プロセスがT
状態ではないのはなぜですかS
?
答え1
インターネット検索では何のヒントも見つからないので、私自身の質問に答えます。
strace(1)
実際にプロセスSIGTTOU
に送信された情報を表示することができます。less
これは似ています
SIGTTIN
が、バックグラウンドジョブのプロセスが端末に書き込んだとき、またはそのモードを設定しようとしたときに生成されます。 ...チラシ...
明らかにtimeout(1)
管理されているプロセスは、デフォルトでバックグラウンドに配置されます。
--foreground
マネージ コマンドがフロント TTY を正しく使用できるように、別のバックグラウンド プログラム グループを作成しないでください。 ...チラシ...
だから私の問題に対する解決策は
$ PAGER='/bin/timeout --foreground 12h /bin/less' man man
(そして私のパッケージのそれに対応するもの)