技術ノート Linux Linux で timeout コマンドを使用する方法

Linux で timeout コマンドを使用する方法

OK、コンピューターの時間はこれで十分です。 timeout コマンドを使用して、プロセスに実行できる最大時間を設定して、プロセスに時間制限を与えることができます。このコマンドを使用してプログラムの実行を制限するチュートリアルを次に示します。

タイムアウトは何をするのでしょうか?

timeout コマンドを使用すると、プログラムの実行 時間の長さに制限を設定 できます。しかし、なぜそれをしたいのでしょうか?

1 つのケースは、プロセスを実行する時間を正確に知っている場合です。一般的な使用例は、ログ ファイルがハード ドライブのスペースを容赦なく食い荒らさないように、ログ プログラムまたはデータ キャプチャ プログラムを timeout 制御することです。

もう 1 つのケースは、プロセスをどれくらいの時間実行する必要があるかわからないが、プロセスを無期限に実行したくないことはわかっている場合です。プロセスを実行中に設定し、ターミナル ウィンドウを最小化し、それらを忘れてしまう習慣があるかもしれません。

一部のプログラム (単純なユーティリティであっても) は、ネットワークのパフォーマンスを妨げる可能性のあるレベルのネットワーク トラフィックを生成する可能性があります。あるいは、ターゲットデバイス上のリソースを拘束し、パフォーマンスを低下させる可能性があります。 ( ping 、私はあなたを見ています。) コンピューターから離れている間、この種のプログラムを長時間実行したままにするのは悪い習慣です。

timeout GNU Core Utils の一部であるため、Linux や macOS など の Unix 系 オペレーティング システムにはすべてタイムアウトが組み込まれています。インストールするものは何もありません。箱から出してすぐに使用できます。

Linux で timeout コマンドを使用する方法

タイムアウトの使用を開始する

ここに簡単な例を示します。たとえば、デフォルトのコマンドライン オプションでは、Ctrl+C を押して停止するまで ping コマンドが実行されます。中断しなければ、そのまま進み続けます。

 ping 192.168.4.28

timeout を使用することで、 ping 何度も実行され、ネットワーク帯域幅を使い果たしたり、ping されているデバイスを妨害したりすることがないようにすることができます。

次のコマンドは、 timeout を使用して ping の時間を制限します。 ping の実行時間は 15 秒とします。

タイムアウト 15 ping 192.168.4.28

15 秒後に timeout 発生すると ping セッションが終了し、コマンド ライン プロンプトに戻ります。

Linux で timeout コマンドを使用する方法

他の時間単位でのタイムアウトの使用

15 の後ろに「s」を追加する必要がないことに注意してください。 timeout 、値が秒単位であると想定されます。 「s」を追加することもできますが、実際には違いはありません。

分、時間、または日で測定される時間値を使用するには、「m」、「h」、または「d」を追加します。

ping を 3 分間実行するには、次のコマンドを使用します。

タイムアウト 3 メートル ping 192.168.4.28

ping timeout が発生して ping セッションを停止するまで 3 分間実行されます。

Linux で timeout コマンドを使用する方法

タイムアウトによるデータキャプチャの制限

一部のデータ キャプチャ ファイルは、すぐに大きくなる可能性があります。このようなファイルが扱いにくくなったり、サイズが問題になったりするのを防ぐには、キャプチャ プログラムの実行時間を制限します。

この例では、 ネットワーク トラフィック キャプチャ ツールである 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 停止しなかったのはなぜですか?

それはすべて信号に関係しています。

Linux で timeout コマンドを使用する方法

正しい信号を送信する

timeout プログラムを停止したい場合、 SIGTERM シグナルを 送信します。これは、プログラムに終了するよう丁寧に要求します。プログラムによっては、SIGTERM シグナルを無視することを選択する場合があります。それが起こった場合、 timeout もう少し強制するように指示する必要があります。

これを行うには、代わりに timeout に SIGKILL シグナルを送信するよう要求します。

SIGKILL シグナルは「捕らえたり、ブロックしたり、無視したり」することはできません。常に通過します。 SIGKILL はプログラムに停止を丁寧に要求しません。 SIGKILL はストップウォッチとコッシュを持って角を曲がったところに隠れます。

-s (シグナル) オプションを使用して、 timeout に SIGKILL シグナルを送信するよう指示できます。

タイムアウト -s SIGKILL 10 sudo tcpdump > Capture.txt

今度は、10 秒が経過するとすぐに tcpdump が停止されます。

Linux で timeout コマンドを使用する方法

まずは丁寧に質問する

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 は常に端末ウィンドウに「Kill​​ed」という 1 語の死亡記事を残すため、 dmesg を停止したのは SIGKILL ではないことがわかります。この場合はそんなことは起こりませんでした。

Linux で timeout コマンドを使用する方法

プログラムの終了コードの取得

正常に動作するプログラムは、終了時に値をシェルに返します。これは終了コードとして知られています。通常、これは、プログラムの実行中に問題が発生したかどうかをシェル (またはプログラムを起動したプロセス) に伝えるために使用されます。

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コマンド

ファイル

tar pv cat tac chmod grep diff sed ar man pushd popd fsck testdisk seq fd pandoc cd $PATH awk join jq fold uniq journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · · mkdir · du · ln · パッチ · 変換 · rclone · シュレッド · srm · scp · gzip · chattr · カット · 検索 · umask · wc · tr

プロセス

エイリアス · スクリーン · トップ · ナイス · renice · 進行状況 · strace · systemd · tmux · chsh · 履歴 · at · バッチ · フリー · what · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · タイムアウト · ウォール · はい · キル · スリープ · sudo · su · タイム · groupadd · usermod · · lshw · シャットダウン · 再起動 · 停止 · パワーオフ · パスワード · lscpu · crontab · 日付 · bg · fg · pidof · nohup · pmap

ネットワーキング

netstat ping ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

関連: 開発者と愛好家のための最高の Linux ラップトップ

「Linux で timeout コマンドを使用する方法」に関するベスト動画選定!

よく使うLinuxコマンド、便利なちょいテクなどを紹介します
【Linux入門】初心者向け!Linuxの基本的なコマンド操作を学ぼう!  〜 Ubuntu 環境で実演〜