timeoutコマンド:指定時間でプロセスを制御する便利ツール

Linuxを使いこなす上で、さまざまなコマンドを効率的に利用することは非常に重要です。今回ご紹介するのは、プロセスの実行時間を制限するための非常に便利なコマンド「timeout」です。特に、スクリプトや自動化タスクでプロセスが無限に実行される事態を防ぎたいとき、timeoutコマンドは大きな助けになります。

この記事では、Linux初心者や中級者を対象に、timeoutコマンドの基本的な使い方から主要なオプション、さらに実践的な応用例までをわかりやすく解説します。これを読めば、timeoutコマンドを活用して、プロセス管理をより効率的に行えるようになるでしょう。


timeoutコマンドの基本的な使い方

timeoutコマンドとは?

timeoutコマンドは、指定した時間が経過した後に自動的にプロセスを終了させるコマンドです。例えば、無限ループや終了条件が不明確なプログラムを実行する際、一定時間で強制的に停止させることができます。

このコマンドを活用することで、システムリソースの浪費を防ぎ、安定した動作を確保することができます。

基本構文

timeoutコマンドの基本的な構文は以下の通りです。

timeout [オプション] 時間 コマンド [引数...]
  • 時間: コマンドが実行される最大時間を指定します(秒、分、時間単位など)。
  • コマンド: 実行したいLinuxコマンドやスクリプト。
  • オプション: timeoutコマンドの動作を変更するためのフラグ。

基本例

例えば、以下のコマンドはpingコマンドを5秒間だけ実行します。

timeout 5 ping google.com

このコマンドでは、pingが5秒後に自動終了します。timeoutを使わない場合、pingは手動で停止するまで実行され続けるため、長時間実行される可能性があります。


timeoutコマンドの主要なオプション

timeoutコマンドには、さまざまなオプションが用意されており、特定のシナリオでの柔軟な使用が可能です。ここでは、よく使われる主要なオプションについて解説します。

1. 時間単位の指定

時間の単位を明示的に指定できます。

  • 秒(デフォルト): 単位を指定しない場合は秒として解釈されます。
  • : mを付けます。
  • 時間: hを付けます。
  • : dを付けます。

例:

timeout 2m ls

この例では、lsコマンドが2分間だけ実行されます。タイムアウト時間を柔軟に設定することで、さまざまなシナリオに対応できます。


2. 終了ステータスの制御(--preserve-status)

デフォルトでは、timeoutコマンドはタイムアウト発生時に終了ステータスを124として返しますが、--preserve-statusオプションを使用すると、元のコマンドの終了ステータスを保持します。

例:

timeout --preserve-status 5 sleep 10

この場合、sleepコマンドが終了時に返すステータスをそのまま保持します。スクリプト内で終了ステータスを正確に確認したい場合に便利です。


3. シグナルの指定(--signal)

デフォルトではSIGTERMシグナルを送信しますが、別のシグナルを指定することも可能です。例えば、SIGKILLシグナルを使えば、プロセスを強制終了できます。

例:

timeout --signal=SIGKILL 5 sleep 10

この例では、5秒後にSIGKILLシグナルを送信してプロセスを即座に終了させます。SIGTERMでは終了しないプロセスに対して有効です。


4. フォアグラウンドでの実行(--foreground)

timeoutコマンドがプロセスをバックグラウンドで実行するのではなく、フォアグラウンドで制御を保持するためのオプションです。これにより、ユーザーが途中でプロセスを中断しやすくなります。

例:

timeout --foreground 5 sleep 10

フォアグラウンドでの制御が必要な場合に、このオプションを使用します。


5. ヘルプとバージョン情報

  • コマンドの使い方を確認したい場合は、以下を使用します。
  timeout --help
  • コマンドのバージョン情報を確認したい場合は、以下を使用します。
  timeout --version

timeoutコマンドの応用

timeoutコマンドは、日常のシステム管理やスクリプト作成において非常に役立ちます。以下に、いくつかの実践的な応用例を紹介します。

1. 無限ループの強制終了

スクリプトやコマンドが意図せず無限ループに陥る場合でも、timeoutを使えば安全に制御できます。

例:

timeout 10 bash -c 'while true; do echo "Running"; sleep 1; done'

このスクリプトは、10秒間だけ「Running」を出力し続け、その後自動的に終了します。長時間のプロセスを制御したい際に非常に便利です。


2. ネットワーク接続のタイムアウト設定

ネットワーク接続が遅延したり応答がない場合に、timeoutで自動的に操作を停止できます。

例:

timeout 5 curl -O http://example.com/largefile.zip

この場合、5秒以内にダウンロードが完了しない場合、curlコマンドが強制終了します。ネットワーク障害時のリトライ処理などに組み込むことができます。


3. バックアップスクリプトでの活用

バックアップスクリプトが長時間実行される場合でも、timeoutを使えば他のプロセスへの影響を最小限に抑えられます。

例:

timeout 1h ./backup.sh

この例では、バックアップスクリプトbackup.shが1時間を超えて実行されることを防ぎます。


4. CPU負荷監視

高負荷なプロセスを監視する際にもtimeoutを活用できます。

例:

timeout 30 top

このコマンドは、topを30秒間だけ実行し、CPU使用率を短時間で確認するのに役立ちます。


5. シェルスクリプトでの応用

timeoutはシェルスクリプト内でも活用できます。以下は、タイムアウト付きで特定のコマンドを実行するスクリプトの例です。

#!/bin/bash

if timeout 10 ls; then
    echo "コマンドは正常に終了しました。"
else
    echo "タイムアウトしました。"
fi

このスクリプトでは、lsコマンドが10秒以内に終了しなければ「タイムアウトしました。」と表示します。


まとめ

timeoutコマンドは、Linuxでプロセスを効率的に管理するための非常に便利なツールです。特に、無限に実行される可能性のあるコマンドやスクリプトを制御する際には不可欠な存在です。本記事では、基本的な使い方から主要なオプション、実践的な応用例までを解説しました。

Linux初心者や中級者の方は、ぜひtimeoutコマンドを実際に試して、システム管理やスクリプト作成の効率を向上させてみてください。そして、他のLinuxコマンドと組み合わせることで、さらに強力な自動化や監視タスクを実現できます。

最後に、公式ドキュメントを参照してさらに深く学びましょう。

man timeout

コメント

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