[Linux]timeout

Linuxを触っていると、「この処理、いつ終わるんだ…?」と不安になったり、あるいは「30秒経っても反応がなければ一旦諦めてほしい」という場面に出くわしたりしますよね。

そんな時に超絶便利なのが timeout コマンド。今回は、暴走するプロセスへの特効薬、timeout の使い方をサクッと解説します!

🕒 timeoutコマンドとは?

timeout は、指定した時間が経過した後にコマンドを自動的に終了させるためのコマンドです。

ネットワークの疎通確認、バックアップ、バッチ処理など、「最長でもこれくらいの時間で切り上げてほしい」という時に真価を発揮します。

基本の書き方

timeout [オプション] 期間 コマンド [引数]...

例えば、sleep コマンドを5秒で強制終了させるにはこう書きます。

timeout 5s sleep 10s

※10秒寝ようとするけど、5秒で叩き起こされます。

💡 よく使う「期間」の指定方法

数値の後に単位を付けることで、直感的に指定できます。

単位意味
s秒 (seconds) ※省略時もこれtimeout 30s ...
m分 (minutes)timeout 5m ...
h時間 (hours)timeout 1h ...
d日 (days)timeout 1d ...

🚀 実践で役立つ「3つの鉄板オプション」

ただ時間を計るだけじゃない、timeout の本領はここからです。

1. 「二段構え」で確実に殺す:--kill-after

通常、timeoutTERM 信号(終了要請)を送りますが、プログラムが頑固だと無視されることがあります。そんな時は「追い打ち」をかけましょう。

# 10秒でTERMを送り、それでもダメなら5秒後にKILL(強制終了)を送る
timeout --kill-after=5s 10s ./heavy-script.sh

2. 終了ステータスを保持する:--preserve-status

デフォルトでは、タイムアウトした時に終了ステータス 124 を返します。しかし、プログラム自身の終了コードをそのまま受け取りたい場合はこれを使います。

timeout --preserve-status 5s ping google.com

3. フォアグラウンドで動かす:--foreground

対話型コマンド(ユーザーの入力を待つものなど)を timeout 経由で動かす場合に、シグナルを正しく伝えるために使用します。

📝 終了コードのルール

timeout が終わった後、echo $? で結果を確認するときのルールです。

  • 124: 指定した時間内に終わらず、タイムアウトした。
  • 125: timeout 自体のコマンドエラー。
  • 137: KILL 信号で強制終了された(128 + 9)。
  • コマンド自体の終了コード: タイムアウトせずに正常に終わった場合。

🛡️ こんな時に使おう!

  • APIや外部サイトへのリクエスト: 相手の返答が遅い時に無限に待つのを防ぐ。
  • バックアップ処理: 深夜のバッチが朝まで残ってサーバーを圧迫するのを防ぐ。
  • テストの自動実行: 無限ループに陥ったテストケースを途中で切り上げる。

[!TIP]

**「とりあえず5分で」**という習慣をつけるだけで、サーバーの負荷が予期せず跳ね上がるリスクを大幅に減らせます。

これであなたも「時間の支配者」です。無駄な待機時間を減らして、スマートなLinuxライフを送りましょう!

コメント

タイトルとURLをコピーしました