コマンドを使用せずに遅延させる代替、回避策、またはbashトリックはありますかsleep
?たとえば、実際に sleep を使用せずに次のコマンドを実行します。
$ sleep 10 && echo "This is a test"
答え1
bash
組み込み関数を使用すると、次のことができます。
coproc read -t 10 && wait "$!" || true
使用しないときは、10秒間スリープモードに切り替わりますsleep
。目的は、stdinを何も出力しないパイプにcoproc
することです。これは、シャットダウン状態が渡されたSIGALRMを反映し、そのオプションが設定されているとシェルがシャットダウンされるためです。read
|| true
wait
errexit
他のシェルでは:
mksh
ksh93
機能が組み込まれているので、他のものをsleep
使用する必要はありません(すべてサポートされますがread -t
)。
zsh
また、サポートされていますが、組み込みread -t
ラッパーもあるので、次のものを使用することselect()
もできます。
zmodload zsh/zselect
zselect -t 1000 # centiseconds
対話型シェルセッションで実行するタスクをスケジュールするには、以下も参照してください。zsh/sched
モジュール入力zsh
。
答え2
以下を選択できますsleep
。彼らはat
とですcron
。これとは対照的に、sleep
実行に必要な時間を提供する必要があります。
atd
を実行してサービスが実行されていることを確認してくださいservice atd status
。
これで、日付が午前11時17分(UTC)であると仮定し、11時25分(UTC)でコマンドを実行する必要がある場合、構文は次のとおりですecho "This is a test" | at 11:25
。
これで、atd
ジョブの完了はデフォルトでは記録されません。詳しくはこちらをご覧ください協会。アプリケーションに独自のロギングがあるのが最善です。でジョブをスケジュールできます
cron
。詳細については、対応するman cron
オプションの表示またはcrontab -e
新しいタスクの追加を参照してください。/var/log/cron
タスクの実行に関する情報を確認できます。
ちなみに、sleep system call
現在の実行を一時停止し、渡された引数に従ってスケジュールをスケジュールします。
編集する:
@Gaiusが述べたように、at
コマンドに分を追加することもできます。しかし、時間があるとしましょう12:30:30
。これでスケジューラを実行しますnow +1 minutes
。 1分(つまり60秒)を指定しても、実際にはジョブが実行されるのをat
待たずに実行されます。時間単位は 。その他の参考資料12:31:30
12:31:00
minutes, hours, days, or weeks
man at
たとえば、echo "ls" | at now +1 minutes
答え3
別のアイデア。
top -d10 -n2 >/dev/null
vmstat 10 2 >/dev/null
sar 10 1 >/dev/null
timeout 10s tail -f /dev/null
答え4
BASICを実行しているマイクロコンピュータの時代には、空のループを介して遅延が発生することが多かった。
FOR I = 1 TO 10000:NEXT
同じ原則を使用してシェルスクリプトに遅延を挿入できます。
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
もちろん、このアプローチの問題は、遅延の長さが異なるシステムのプロセッサ速度に依存することです(または異なる負荷を受ける同じシステムでも同じです)。とは異なり、sleep
CPU(またはコアのいずれか)を最大化することもできます。