ウェブサイト検索

Bashで不必要な遅延なしにコマンドをタイムアウトさせる方法


Bashでは、時には完了するのに時間がかかるコマンドを実行する必要がある場合があり、その完了を無期限に待ちたくないことがあります。この問題への一つの解決策は、コマンドの実行時間を制限するタイムアウトコマンドを使用することです。この記事では、不要な遅延なしにBashでコマンドにタイムアウトを設定する方法について説明します。

Bashでコマンドのタイムアウト

Bashでコマンドのタイムアウトを設定するには、“timeout”コマンドを使用します。“timeout”コマンドはすべてのシステムにデフォルトで存在するわけではありませんが、ほとんどのLinuxディストリビューションのパッケージマネージャーを使用してインストールすることができます。ここに“timeout”コマンドの構文があります:

timeout [OPTION] DURATION COMMAND [ARG]

ここで「OPTION」はタイムアウトコマンドの動作を指定するオプションの引数であり、「DURATION」はコマンドが実行される時間制限を示し、「COMMAND [ARG]」は実行したいコマンドとその引数です。

たとえば、5秒間「sleep」コマンドを実行したいとしましょうが、コマンドを3秒後にタイムアウトさせたいとします。以下はその例のシェルスクリプトです:

#!/bin/bash
echo "Starting sleep command with timeout of 3 seconds..."
timeout 3s sleep 5s
echo "Sleep command finished."

ここでは、タイムアウトの期間を3秒、"sleep"コマンドの期間を5秒として指定しています。"timeout"コマンドは3秒後に"sleep"コマンドを停止しますが、通常"sleep"コマンドは5秒間実行されることになります。

「タイムアウト」コマンドを使用する際に不必要な遅延を防ぐために、「-k」オプションを使用できます。「-k」オプションは、タイムアウト制限を超えた場合にコマンドに送信される信号を指定します。この信号により、コマンドが優雅に終了するのを待つのではなく、直ちに終了します。

例えば、5秒間「sleep」コマンドを実行したいとしますが、3秒後にタイムアウトし、タイムアウトの制限を超えた場合はSIGINT信号を送信したいとします。次のコマンドを実行することでこれを行うことができます:

#!/bin/bash
echo "Starting sleep command with timeout of 3 seconds and SIGINT signal after 2 seconds”
timeout -k 2s 3s sleep 5s
echo "Sleep command finished."

ここでは、タイムアウト時間を3秒に設定し、タイムアウト制限を超えた場合に送信される信号をSIGINTと指定しました。「-k 2s」オプションは、タイムアウト制限の2秒後にSIGINT信号が送信されることを指定しています。

結論

Bashのコマンドのタイムアウトは、コマンドをより効率的に実行し、不要な遅延を防ぐのに役立つ便利なツールです。「timeout」コマンドと「-k」オプションを使用することで、コマンドの実行時間を制限し、タイムアウト制限を超えた場合には直ちに終了シグナルを送ることができます。これにより、時間を節約し、スクリプトをより効率的に実行することができます。