Coreutils timeout(1) は man/less ではうまく機能しません。

Coreutils timeout(1) は man/less ではうまく機能しません。

less(1)私たちの会社の本番サーバーでコマンドのタイムアウトを設定したいと思います。毎日大きなログファイルを作成し、毎晩アーカイブ/削除するバッチジョブがありますが、(長期)実行プロセスがブロックされる可能性があるため、ディスク使用率が高いという警告が表示されることがあります。ファイルはunlink(2)参照によって物理的に-ed - POSIXファイルシステムの意味論的数。

これらの迷惑の最も一般的なケースを避けるために、私はlessそれを実行するラッパーを作成しました。timeout(1)lessファイルシステムに開かれたファイルを残すことなく、数時間後にアイドルプロセスが自動的に終了します。

しかし、結果は誤動作します。コマンドがman(1)環境変数を介してラッパーを開始すると、キーボード入力への応答が停止します。以下は、再現可能な最小限のテストケースです。manPAGER

$ 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

(そして私のパッケージのそれに対応するもの)

関連情報