実はこれがtimeout
TIMEOUT(1) User Commands TIMEOUT(1)
NAME
timeout - run a command with a time limit
SYNOPSIS
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]
DESCRIPTION
Start COMMAND, and kill it if still running after DURATION.
[email protected]:~$ dpkg -S /usr/bin/timeout
coreutils: /usr/bin/timeout
この機能を提供する (少なくとも) 2 つのプログラムがあります:
<ブロック引用>名前
timelimit
— プロセスの絶対実行時間を効果的に制限する
あらすじ
timelimit [-pq] [-S killsig] [-s warnsig] [-T killtime] [-t warntime] command [arguments ...]
そして
<ブロック引用>名前
timeout
- 時間制限のあるコマンドを実行
あらすじ
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]
それらは次のようにパッケージ化されています:
$ dlocate `which timeout timelimit`
timelimit: /usr/bin/timelimit
coreutils: /usr/bin/timeout
比較:
/-----------------------------+------------+----------------\
| Feature | timelimit | timeout |
+=============================+============+================+
| time to run | -t time | first argument |
+-----------------------------+------------+----------------+
| terminate signal | -s signal | -s signal |
+-----------------------------+------------+----------------+
| grace period | -T time | -k time |
+-----------------------------+------------+----------------+
| kill signal | -S signal | (note 1) |
+-----------------------------+------------+----------------+
| propagate signals | -p | (note 2) |
\-----------------------------+------------+----------------/
注:
<オール>timeout
常に SIGKILL
を使用 最後の手段として。timeout
子プログラムが終了したときにシグナルで終了する機能はありません。2 つのプログラムの終了ステータスは異なりますが、これをうまく要約するのは難しいため、マニュアル ページを自分で参照することをお勧めします。
timeout
として デフォルトでより多くのシステムにインストールされます (coreutils
は多くのディストリビューションの標準パッケージです)、timelimit
によって提供される追加機能が必要でない限り、それを使用することをお勧めします .
純粋な bash
組み込み、coreutils なし
このソリューションは bash
で機能することがわかりました 組み込みに依存 外部実行可能ファイルを呼び出さずにコマンドを実行します。最終的にcoreutilsさえインストールされていないシステムで動作します
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
説明 :&
を使用してバックグラウンドでコマンドを送信する場合は通常どおり 、その PID は内部変数 $!
に格納されます (dash
の最新バージョンに存在) 、 csh
、 bash
、 tcsh
、 zsh
...)。
シェル間の実際の違いは、ビルトイン の存在です。 コマンド read
およびオプション -t
の .最初のバージョンでは、ユーザーが指定された秒数の前に入力行を完了しない場合、命令は終了し、エラー リターン コードが生成されます。
2 番目のバージョンは 1 番目と同じように機能しますが、enter を押すだけで強制終了タイムアウトを中止できます .
確かに or 演算子 ||
kill
を実行します read
の場合のみステートメント コマンドは、タイムアウトの期限が切れた場合と同様に、ゼロ以外のリターン コードで終了します。 Enter を押すと その瞬間より前に、0 を返し、前のコマンドを強制終了しません。
Coreutils ソリューション
coreutils の場合 システムに存在するため、時間とリソースを節約して外部プログラムを呼び出す必要はありません timeout
と sleep
どちらも目標を達成するための完璧な方法です。
timeout
timeout
の使用 簡単です。
最終的には -k
も使用することを検討できます 最初に失敗した場合に追加の kill シグナルを送信するオプション。
timeout 5m YourCommand # 3rd version
sleep
sleep
で ファンタジーを使用したり、インスピレーションを得ることができます。コマンドをバックグラウンドまたはフォアグラウンドに残すことができることに注意してください (例:top
通常はフォアグラウンドにする必要があります)。
YourCommand & sleep 5m; kill $! # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) & # 5th Background
bash -c '(sleep 5m; kill $$) & exec YourCommand' # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
説明
もちろん、各バージョンで必要な kill シグナルをデフォルトのものから extreme まで送信できます。 kill -9
、本当に必要な場合にのみ使用します。
参考文献
- [1] Coreutils
- [2] Bash ビギナーズ ガイド
- [3] BashFAQ