OK、コンピューターの時間はこれで十分です。
timeout
コマンドを使用して、プロセスに実行できる最大時間を設定して、プロセスに時間制限を与えることができます。このコマンドを使用してプログラムの実行を制限するチュートリアルを次に示します。
タイムアウトは何をするのでしょうか?
timeout
コマンドを使用すると、プログラムの実行
時間の長さに制限を設定
できます。しかし、なぜそれをしたいのでしょうか?
1 つのケースは、プロセスを実行する時間を正確に知っている場合です。一般的な使用例は、ログ ファイルがハード ドライブのスペースを容赦なく食い荒らさないように、ログ プログラムまたはデータ キャプチャ プログラムを
timeout
制御することです。
もう 1 つのケースは、プロセスをどれくらいの時間実行する必要があるかわからないが、プロセスを無期限に実行したくないことはわかっている場合です。プロセスを実行中に設定し、ターミナル ウィンドウを最小化し、それらを忘れてしまう習慣があるかもしれません。
一部のプログラム (単純なユーティリティであっても) は、ネットワークのパフォーマンスを妨げる可能性のあるレベルのネットワーク トラフィックを生成する可能性があります。あるいは、ターゲットデバイス上のリソースを拘束し、パフォーマンスを低下させる可能性があります。 (
ping
、私はあなたを見ています。) コンピューターから離れている間、この種のプログラムを長時間実行したままにするのは悪い習慣です。
timeout
GNU Core Utils
の一部であるため、Linux や macOS など
の Unix 系
オペレーティング システムにはすべてタイムアウトが組み込まれています。インストールするものは何もありません。箱から出してすぐに使用できます。
タイムアウトの使用を開始する
ここに簡単な例を示します。たとえば、デフォルトのコマンドライン オプションでは、Ctrl+C を押して停止するまで
ping
コマンドが実行されます。中断しなければ、そのまま進み続けます。
ping 192.168.4.28
timeout
を使用することで、
ping
何度も実行され、ネットワーク帯域幅を使い果たしたり、ping されているデバイスを妨害したりすることがないようにすることができます。
次のコマンドは、
timeout
を使用して
ping
の時間を制限します。
ping
の実行時間は 15 秒とします。
タイムアウト 15 ping 192.168.4.28
15 秒後に
timeout
発生すると
ping
セッションが終了し、コマンド ライン プロンプトに戻ります。
他の時間単位でのタイムアウトの使用
15 の後ろに「s」を追加する必要がないことに注意してください。
timeout
、値が秒単位であると想定されます。 「s」を追加することもできますが、実際には違いはありません。
分、時間、または日で測定される時間値を使用するには、「m」、「h」、または「d」を追加します。
ping を 3 分間実行するには、次のコマンドを使用します。
タイムアウト 3 メートル ping 192.168.4.28
ping
、
timeout
が発生して
ping
セッションを停止するまで 3 分間実行されます。
タイムアウトによるデータキャプチャの制限
一部のデータ キャプチャ ファイルは、すぐに大きくなる可能性があります。このようなファイルが扱いにくくなったり、サイズが問題になったりするのを防ぐには、キャプチャ プログラムの実行時間を制限します。
この例では、
ネットワーク トラフィック キャプチャ
ツールである
tcpdump
を使用しています。この記事の調査対象となったテスト マシンでは、Ubuntu Linux と Fedora Linux に
tcpdump
すでにインストールされています。次のコマンドを使用して、Manjaro Linux および Arch Linux にインストールする必要がありました。
sudo pacman -Syu tcpdump
次のコマンドを使用して、デフォルトのオプションで
tcpdump
10 秒間実行し、その出力を Capture.txt というファイルにリダイレクトできます。
タイムアウト 10 sudo tcpdump > Capture.txt
(
tcpdump
には、キャプチャしたネットワーク トラフィックをファイルに保存するための独自のオプションがあります。ここでは
tcpdump
ではなく
timeout
説明しているため、これは簡単なハックです。)
tcpdump
ネットワーク トラフィックのキャプチャを開始し、10 秒間待機します。そして 10 秒が経過しても
tcpdump
まだ実行されており、capture.txt のサイズは依然として大きくなっています。
tcpdump
停止するには、急いで Ctrl+C を押す必要があります。
ls
で Capture.txt のサイズを確認すると、数秒で 209K まで増加したことがわかります。そのファイルは急速に成長していました。
ls -lh キャプチャ.txt
どうしたの?
timeout
tcpdump
停止しなかったのはなぜですか?
それはすべて信号に関係しています。
正しい信号を送信する
timeout
プログラムを停止したい場合、
SIGTERM シグナルを
送信します。これは、プログラムに終了するよう丁寧に要求します。プログラムによっては、SIGTERM シグナルを無視することを選択する場合があります。それが起こった場合、
timeout
もう少し強制するように指示する必要があります。
これを行うには、代わりに
timeout
に SIGKILL シグナルを送信するよう要求します。
SIGKILL シグナルは「捕らえたり、ブロックしたり、無視したり」することはできません。常に通過します。 SIGKILL はプログラムに停止を丁寧に要求しません。 SIGKILL はストップウォッチとコッシュを持って角を曲がったところに隠れます。
-s
(シグナル) オプションを使用して、
timeout
に SIGKILL シグナルを送信するよう指示できます。
タイムアウト -s SIGKILL 10 sudo tcpdump > Capture.txt
今度は、10 秒が経過するとすぐに
tcpdump
が停止されます。
まずは丁寧に質問する
SIGTERM を使用してプログラムの停止を試行し、SIGTERM が機能しなかった場合にのみ SIGKILL を送信するように
timeout
を要求できます。
これを行うには、
-k
(kill after) オプションを使用します。
-k
オプションには、パラメータとして時刻値が必要です。
このコマンドでは、
dmesg
30 秒間実行し、その後 SIGTERM シグナルで終了するように
timeout
を要求しています。 40 秒経っても
dmesg
まだ実行されている場合は、外交的な SIGTERM が無視されたため、ジョブを終了するには
timeout
で SIGKILL を送信する必要があることを意味します。
dmesg
は
、カーネル リング バッファ メッセージを監視し
、ターミナル ウィンドウに表示できるユーティリティです。
タイムアウト -k 40 30 dmseg -w
dmesg
30 秒間実行され、SIGTERM シグナルを受信すると停止します。
SIGKILL は常に端末ウィンドウに「Killed」という 1 語の死亡記事を残すため、
dmesg
を停止したのは SIGKILL ではないことがわかります。この場合はそんなことは起こりませんでした。
プログラムの終了コードの取得
正常に動作するプログラムは、終了時に値をシェルに返します。これは終了コードとして知られています。通常、これは、プログラムの実行中に問題が発生したかどうかをシェル (またはプログラムを起動したプロセス) に伝えるために使用されます。
timeout
独自の終了コードを提供しますが、それについては気にしないかもしれません。おそらく、
timeout
が制御しているプロセスからの終了コードに関心があるでしょう。
このコマンドにより、
ping
5 秒間実行されます。この記事の調査に使用されたテスト ネットワーク上にある Nostromo というコンピュータに ping を送信しています。
タイムアウト 5 ping Nostromo.local
コマンドは 5 秒間実行され、
timeout
終了します。次に、次のコマンドを使用して終了コードを確認します。
エコー$?
終了コードは 124 です。これは、プログラムが SIGTERM を使用して終了されたことを示すために
timeout
が使用する値です。 SIGKILL がプログラムを終了すると、終了コードは 137 になります。
Ctrl+C でプログラムを中断すると、
timeout
の終了コードは 0 になります。
タイムアウト 5 ping Nostromo.local
エコー$?
timeout
を終了する前にプログラムの実行が終了した場合、
timeout
終了コードをプログラムからシェルに戻すことができます。
これを実現するには、プログラムが自然に停止する必要があり (つまり、
timeout
によって終了しない)、
--preserve-status
オプションを使用する必要があります。
-c
(カウント) オプションを値 5 で使用すると、
ping
5 つのリクエストのみを発行します。
timeout
の期間を 1 分にすると、
ping
確実に自動的に終了します。その後、
echo
を使用して終了値を確認できます。
タイムアウト --preserve-status 1m ping -c 5 Nostromo.local
エコー$?
ping
5 つの ping 要求を完了して終了します。終了コードはゼロです。
終了コードが
ping
からのものであることを確認するには、
ping
に別の終了コードを生成させてみましょう。存在しない IP アドレスに ping リクエストを送信しようとすると、
ping
エラー終了コードで失敗します。次に、
echo
を使用して、終了コードがゼロ以外であることを確認します。
タイムアウト --preserve-status 1m ping -c 5 NotHere.local
エコー$?
ping
コマンドは明らかに存在しないデバイスに到達できないため、エラーを報告して終了します。終了コードは2です。これは、
ping
一般的なエラーに使用する終了コードです。
基本ルールの設定
timeout
目的は、実行中のプログラムに何らかの境界を設けることです。ログ ファイルがハード ドライブをオーバーランする危険性がある場合、またはネットワーク ツールを実行したままにしておくのを忘れる可能性がある場合は、ログ ファイルを
timeout
で囲み、コンピュータを自己制御させます。
関連: 開発者と愛好家のための最高の Linux ラップトップ





