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