一定時間後にコマンドを自動強制終了するコマンドラインコマンドに対するこの回答
bashコマンドラインから実行時間の長いコマンドをタイムアウトする1行の方法を提案しています:
( /path/to/slow command with options ) & sleep 5 ; kill $!
ただし、特定の「長時間実行」コマンドがタイムアウトよりも早く終了する可能性があります。
(「通常は長時間実行されますが、場合によっては高速な」コマンド、または楽しみのためにtlrbsfと呼びましょう。)
したがって、この気の利いたワンライナー アプローチにはいくつかの問題があります。
まず、sleep
は条件付きではないため、シーケンスの終了にかかる時間に望ましくない下限が設定されます。tlrbsfコマンドが 2 秒で終了する場合、スリープには 30秒、2 分、さらには 5 分を考慮してください— 非常に望ましくありません。
第 2 に、kill
は無条件であるため、このシーケンスは実行されていないプロセスを強制終了し、それについて愚痴をこぼそうとします。
そう...
通常は長時間実行されますが、時には高速な ( "tlrbsf" ) コマンドをタイムアウトする方法はありますか?
- bashの実装があります(他の質問にはすでにPerlとCの回答があります)
- 2 つのうち早い方で終了します: tlrbsfプログラムの終了、またはタイムアウトの経過
- 存在しない/実行されていないプロセスを強制終了しません (または、オプションで:不適切な強制終了について文句を言いません)
- 1ライナーである必要はありません
- Cygwin または Linux で実行可能
...そして、ボーナスポイント
- フォアグラウンドでtlrbsfコマンドを実行します
- バックグラウンドでの「スリープ」または余分なプロセス
直接実行された場合と同じように、 tlrbsfコマンドの stdin/stdout/stderr をリダイレクトできますか?
もしそうなら、あなたのコードを共有してください。そうでない場合は、その理由を説明してください。
前述の例をハックしようとしてしばらく時間を費やしましたが、bash スキルの限界に達しています。