GNU/Linux >> Linux の 問題 >  >> Linux

コマンドを 5 分間実行させる簡単な方法は何ですか?

実はこれがtimeout

TIMEOUT(1)                          User Commands                         TIMEOUT(1)

NAME
       timeout - run a command with a time limit

SYNOPSIS
       timeout [OPTION] DURATION COMMAND [ARG]...
       timeout [OPTION]

DESCRIPTION
       Start COMMAND, and kill it if still running after DURATION.

[email protected]:~$ dpkg -S /usr/bin/timeout
coreutils: /usr/bin/timeout

この機能を提供する (少なくとも) 2 つのプログラムがあります:

<ブロック引用>

名前

timelimit — プロセスの絶対実行時間を効果的に制限する

あらすじ

timelimit [-pq] [-S killsig] [-s warnsig] [-T killtime] [-t warntime] command [arguments ...]

そして

<ブロック引用>

名前

timeout - 時間制限のあるコマンドを実行

あらすじ

timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]

それらは次のようにパッケージ化されています:

$ dlocate `which timeout timelimit`
timelimit: /usr/bin/timelimit
coreutils: /usr/bin/timeout

比較:

/-----------------------------+------------+----------------\
|            Feature          |  timelimit |     timeout    |
+=============================+============+================+
|   time to run               | -t time    | first argument |
+-----------------------------+------------+----------------+
|   terminate signal          | -s signal  | -s signal      |
+-----------------------------+------------+----------------+
|   grace period              | -T time    | -k time        |
+-----------------------------+------------+----------------+
|   kill signal               | -S signal  | (note 1)       |
+-----------------------------+------------+----------------+
|   propagate signals         | -p         | (note 2)       |
\-----------------------------+------------+----------------/

注:

<オール>
  • timeout 常に SIGKILL を使用 最後の手段として。
  • timeout 子プログラムが終了したときにシグナルで終了する機能はありません。
  • 2 つのプログラムの終了ステータスは異なりますが、これをうまく要約するのは難しいため、マニュアル ページを自分で参照することをお勧めします。

    timeout として デフォルトでより多くのシステムにインストールされます (coreutils は多くのディストリビューションの標準パッケージです)、timelimit によって提供される追加機能が必要でない限り、それを使用することをお勧めします .


    純粋な bash 組み込み、coreutils なし

    このソリューションは bash で機能することがわかりました 組み込みに依存 外部実行可能ファイルを呼び出さずにコマンドを実行します。最終的にcoreutilsさえインストールされていないシステムで動作します

    YourCommand & read -t 300 ;  kill $!                           # 1st version
    YourCommand & read -t 300 || kill $!                           # 2nd version 
    

    説明 :& を使用してバックグラウンドでコマンドを送信する場合は通常どおり 、その PID は内部変数 $! に格納されます (dash の最新バージョンに存在) 、 cshbashtcshzsh ...)。
    シェル間の実際の違いは、ビルトイン の存在です。 コマンド read およびオプション -t の .最初のバージョンでは、ユーザーが指定された秒数の前に入力行を完了しない場合、命令は終了し、エラー リターン コードが生成されます。

    <ブロック引用>

    2 番目のバージョンは 1 番目と同じように機能しますが、enter を押すだけで強制終了タイムアウトを中止できます .
    確かに or 演算子 || kill を実行します read の場合のみステートメント コマンドは、タイムアウトの期限が切れた場合と同様に、ゼロ以外のリターン コードで終了します。 Enter を押すと その瞬間より前に、0 を返し、前のコマンドを強制終了しません。

    Coreutils ソリューション

    coreutils の場合 システムに存在するため、時間とリソースを節約して外部プログラムを呼び出す必要はありません timeoutsleep どちらも目標を達成するための完璧な方法です。

    timeout timeout の使用 簡単です。
    最終的には -k も使用することを検討できます 最初に失敗した場合に追加の kill シグナルを送信するオプション。

    timeout 5m YourCommand                                         # 3rd version 
    

    sleep sleep で ファンタジーを使用したり、インスピレーションを得ることができます。コマンドをバックグラウンドまたはフォアグラウンドに残すことができることに注意してください (例:top 通常はフォアグラウンドにする必要があります)。

    YourCommand & sleep 5m; kill $!                                # 4th Background
    YourCommand & pid=$! ; (sleep 5m; kill $pid;) &                # 5th Background
    
    bash -c '(sleep 5m; kill $$) & exec YourCommand'               # 6th Foreground
    (cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
    

    説明

    もちろん、各バージョンで必要な kill シグナルをデフォルトのものから extreme まで送信できます。 kill -9 、本当に必要な場合にのみ使用します。

    参考文献

    • [1] Coreutils
    • [2] Bash ビギナーズ ガイド
    • [3] BashFAQ

    Linux
    1. 「cd -」は何の略ですか?

    2. Windows の Linux の File コマンドに相当するものは何ですか?

    3. Linux test -a コマンド テストとは何ですか?

    1. コマンド単一引数の最大サイズを定義するものは何ですか?

    2. CronJob 25 分ごと

    3. id -r コマンドの適切な構文

    1. コマンドCat/proc / cpuinfoを実行するとどうなりますか?

    2. HH:MM:SS (時:分:秒.分割秒) を秒に変換する簡単な方法

    3. Mac 用の Linux の updatedb コマンドに相当するものは何ですか?