web-dev-qa-db-ja.com

シェル:「スリープ」を使用せずにコマンドを遅延させることは可能ですか?

sleepを使用せずにコマンドを遅延させるための代替手段、代替手段、またはbashトリックはありますか?たとえば、実際にスリープを使用せずに次のコマンドを実行します。

$ sleep 10 && echo "This is a test"
22
user321697

sleepに代わるものがあります:atcronです。 sleepとは逆に、これらを実行するために必要な時間を提供する必要があります。

  • service atd statusを実行して、atdサービスが実行されていることを確認します。
    では、日付がUTCの午前11時17分だとします。コマンドを11:25 UTCに実行する必要がある場合、構文はecho "This is a test" | at 11:25です。
    ここで、デフォルトではatdはジョブの完了をログに記録しないことに注意してください。詳細はこちら link を参照してください。アプリケーションに独自のロギングがあることをお勧めします。

  • 詳細については、cronでジョブをスケジュールできます。詳細については、man cronを参照してオプションを確認するか、crontab -eで新しいジョブを追加してください。 /var/log/cronは、ジョブの実行に関する情報を確認できます。

FYI sleep system callは現在の実行を一時停止し、それをw.r.tでスケジュールします。渡された引数。

編集:

@Gaiusが述べたように、atコマンドに分の時間を追加することもできます。ただし、時間は12:30:30であり、スケジューラはnow +1 minutesで実行したとします。 60秒に変換される1分が指定されていても、atは実際に12:31:30までジョブを実行するのを待機せず、12:31:00でジョブを実行します。時間単位はminutes, hours, days, or weeksにすることができます。詳細については、man atをご覧ください

例:echo "ls" | at now +1 minutes

18
ss_iwe

bashビルトインを使用すると、次のことができます。

_coproc read -t 10 && wait "$!" || true
_

sleepを使用せずに10秒間スリープする。 coprocは、readのstdinが何も出力されないパイプになるようにするためのものです。 _|| true_は、waitの終了ステータスがerrexitオプションが設定されている場合にシェルを終了させるSIGALRM配信を反映するためです。

他のシェルでは:

mkshと_ksh93_にはsleepが組み込まれています。他に何も使用しても意味がありません(どちらも_read -t_もサポートしています)。

zshは_read -t_もサポートしますが、select()の組み込みラッパーも備えているため、次のものも使用できます。

_zmodload zsh/zselect
zselect -t 1000 # centiseconds
_

インタラクティブなシェルセッションから実行するようにスケジュールする場合は、_ _zsh/sched_モジュールのzsh も参照してください。

29

他のいくつかのアイデア。

top -d10 -n2 >/dev/null

vmstat 10 2 >/dev/null

sar 10 1 >/dev/null

timeout 10s tail -f /dev/null
7
steve

readの非標準の-t delayオプションを使用することを提案している回答があるため、標準のシェルでタイムアウトした読み取りを行う方法を次に示します。

{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }

stty timeの引数は、1/10秒単位です。

6
mosvy

Bash組み込み変数$SECONDSとbusy-loopを使用します。

for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
5
Jeff Schaller

本の中で最も古いトリック:

read && echo "This is a test"

ちょうどヒット Enter そしてそれは続くでしょう!

4
Fabby

マイクロコンピュータがBASICを実行していた時代には、遅延は通常空のループで実現されていました。

FOR I = 1 TO 10000:NEXT

同じ原則を使用して、シェルスクリプトに遅延を挿入できます。

COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done

もちろん、このアプローチの問題は、遅延の長さがプロセッサの速度に応じてマシンごとに異なることです(または、同じマシン上でも異なる負荷がかかる)。 sleepとは異なり、CPU(またはそのコアの1つ)もおそらく最大になります。

4
Psychonaut

Windowsとバッチの土地からのクラシック:

ping -c 11 localhost >/dev/null && echo "This is a test"
3
Joker_vD

sleepと同じ機能を持つ組み込みはありません(sleepが組み込まれていない場合)。ただし、待機する他のコマンドがいくつかあります。

いくつか含まれています。

  • atおよびcron:特定の時間にタスクをスケジュールするために使用されます。

  • inotifywait:ファイル、またはファイルの変更/削除/追加/その他を待機するために使用されます

3
ctrl-alt-delor

ファイル内の新しい行をインタラクティブに待機する場合は、

tail -f

ファイルシステムの変更を待っていますか?次に、例えば.

inotify / inoticoming

また、「待機」の意味に応じて、他のオプションもあります。

0
Edheldil