この答えに一定時間後にコマンドを自動的に終了するコマンドラインコマンド
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プログラムの終了、またはタイムアウトの経過のいずれか早い方で終了します。
- 存在しない/実行されていないプロセスを強制終了しません (または、オプションで、不正な強制終了についてエラーを出力しません)
- 1行で終わる必要はない
- CygwinまたはLinuxで実行可能
...そしてボーナスポイントとして
- tlrbsfコマンドをフォアグラウンドで実行する
- バックグラウンドでの「スリープ」または余分なプロセス
tlrbsfコマンドの stdin/stdout/stderr を、直接実行した場合と同じようにリダイレクトできますか?
もしそうなら、コードを共有してください。そうでない場合は、その理由を説明してください。
私は前述の例をハッキングしようとしばらく試みましたが、私の bash スキルの限界に達しました。
ベストアンサー1
おそらく、coreutils のコマンドを探しているのでしょうtimeout
。これは coreutils の一部なので、技術的には C ソリューションですが、それでも coreutils です。info timeout
詳細については、こちらを参照してください。次に例を示します。
timeout 5 /path/to/slow/command with options