Linux timeout コマンド
timeout は Linux システムの実用的なコマンドで、指定した時間の経過後に実行中のコマンドを終了します。このコマンドは特に以下のシナリオに適しています:
- 長時間実行されるプロセスの制限
- スクリプトやプログラムの無期限実行を防ぐ
- 重要な操作に実行時間の上限を設定する
- 自動化テストにおけるタイムアウト制御
timeout コマンドは GNU coreutils パッケージの一部であり、ほとんどの Linux ディストリビューションにプリインストールされています。
コマンド構文
timeout コマンドの基本構文は次のとおりです:
timeout [选项] 持续时间 命令 [参数...]
パラメータの説明
-
持続時間:
- 数値のみを指定できます(デフォルトの単位は秒)
- 単位を指定することもできます:
10s(10秒)、5m(5分)、1h(1時間) - 小数にも対応しています:
0.5s(500ミリ秒)、1.5m(1分30秒)
-
コマンド:
- 実行するコマンドまたはプログラム
- 組み込みコマンドでも外部プログラムでも指定できます
-
パラメータ:
- コマンドに渡すパラメータ
一般的なオプション
| オプション | 説明 | 例 |
|---|---|---|
-s 或 --signal |
タイムアウト後に送信するシグナルを指定します(デフォルトは TERM) | timeout -s KILL 5s command |
-k 或 --kill-after |
初期シグナルが無効な場合、指定時間後に KILL シグナルを送信します | timeout -k 5s 10s command |
--preserve-status |
終了したコマンドの終了ステータスを返します | timeout --preserve-status 5s command |
--foreground |
コマンドをフォアグラウンドで実行します(デフォルトはバックグラウンド) | timeout --foreground 5s command |
-v 或 --verbose |
詳細な出力を表示します | timeout -v 5s command |
使用例
基本的な使い方
例
# 5秒後に ping コマンドを終了
timeout 5s ping example.com
# 1分後にスクリプトの実行を終了
timeout 1m ./long_script.sh
timeout 5s ping example.com
# 1分後にスクリプトの実行を終了
timeout 1m ./long_script.sh
シグナルタイプの指定
例
# 3秒後に INT シグナルを送信(Ctrl+C に相当)
timeout -s INT 3s command
# 10秒後に KILL シグナルを送信(強制終了)
timeout -s KILL 10s command
timeout -s INT 3s command
# 10秒後に KILL シグナルを送信(強制終了)
timeout -s KILL 10s command
組み合わせて使用
例
# 最初に TERM シグナルを送信し、5秒後に KILL シグナルを送信
timeout -k 5s 10s command
timeout -k 5s 10s command
終了ステータスの取得
例
# 終了したコマンドの終了ステータスを保持
timeout --preserve-status 5s command
echo $? # 終了ステータスコードを確認
timeout --preserve-status 5s command
echo $? # 終了ステータスコードを確認
実際の活用シーン
1. スクリプトの無限実行を防ぐ
例
# データベースバックアップスクリプトの実行を最大2時間に制限
timeout 2h ./backup_database.sh
timeout 2h ./backup_database.sh
2. 自動化テストにおけるタイムアウト制御
例
# テストケースの実行を最大30秒に制限
timeout 30s ./run_test_case.sh
timeout 30s ./run_test_case.sh
3. ネットワーク操作のタイムアウト
例
# ファイルのダウンロード試行を最大1分間に制限
timeout 1m wget http://example.com/large_file.zip
timeout 1m wget http://example.com/large_file.zip
4. 対話型プログラムのタイムアウト処理
例
# ユーザーに最大10秒間の入力選択を許可
timeout 10s read -p "選択を入力してください: " choice
timeout 10s read -p "選択を入力してください: " choice
注意事項
-
シグナル処理:
- 一部のプログラムは TERM シグナルを捕捉して無視する場合があります。その場合は KILL シグナルを使用する必要があります
- 重要なデータを操作する際は、データが破損する可能性があるため、KILL シグナルの使用は慎重に行ってください
-
子プロセスの処理:
- timeout はデフォルトで直接起動したプロセスのみを終了し、すべての子プロセスを終了するとは限りません
- プロセスツリー全体を終了する場合は、以下のコマンドとの組み合わせを検討できます
killコマンド
-
時間精度:
- Linux カーネルの時間精度は通常ミリ秒単位です
- 非常に短い時間(例: 0.001s)は正確に制御できない場合があります
-
戻り値:
- コマンドがタイムアウト前に完了した場合、コマンドの終了ステータスを返します
- タイムアウトにより終了した場合は 124 を返します
- timeout 自体がエラーの場合は 125-128 を返します
上級テクニック
1. 他のコマンドと組み合わせる
例
# タイムアウト後にクリーンアップ操作を実行
timeout 30s command || echo "コマンドがタイムアウトしました。クリーンアップを実行します..."
timeout 30s command || echo "コマンドがタイムアウトしました。クリーンアップを実行します..."
2. スクリプト内での使用
例
#!/bin/bash
if timeout 10s command; then
echo "コマンドが正常に完了しました"
else
echo "コマンドがタイムアウトしたか、失敗しました"
fi
if timeout 10s command; then
echo "コマンドが正常に完了しました"
else
echo "コマンドがタイムアウトしたか、失敗しました"
fi
3. リソース使用量の監視
例
# CPU時間を制限(ulimit と組み合わせる必要があります)
(ulimit -t 10; timeout 20s command)
(ulimit -t 10; timeout 20s command)
よくある質問(FAQ)
Q1: timeout と sleep の違いは何ですか?
A: sleep は指定した時間を単に待機するだけですが、timeout は別のコマンドの実行時間を制限します。
Q2: timeout が起動したすべての子プロセスを終了するにはどうすればよいですか?
A: プロセスグループ方式を使用できます:
timeout --foreground 10s sh -c 'command & wait'
Q3: タイムアウト後、プログラムがすぐに終了しないのはなぜですか?
A: プログラムがデフォルトの TERM シグナルを捕捉している可能性があります。使用してみてください-s KILLオプション。
Q4: コマンドがタイムアウトによって終了したかどうかを判断するにはどうすればよいですか?
A: 終了ステータスコードが 124 かどうかを確認します:
例
timeout 5s slow_command
if [ $? -eq 124 ]; then
echo "コマンドはタイムアウトにより終了しました"
fi
if [ $? -eq 124 ]; then
echo "コマンドはタイムアウトにより終了しました"
fi
まとめ
timeout コマンドは Linux システム管理において非常に役立つツールであり、以下のことに役立ちます:
- プログラムの実行時間を制御し、リソースが長時間占有されるのを防ぎます
- スクリプトの堅牢性を高め、無限待機を回避します
- 自動化タスクにタイムアウトメカニズムを実装します
- 実行時間が予測できない操作を処理します
timeout コマンドを適切に使用することで、Linux システム管理をより効率的かつ信頼性の高いものにできます。
その他の拡張
Linux コマンド大全