Shell: "sleep"を使用せずにコマンドを遅延させることは可能ですか?

Shell: "sleep"を使用せずにコマンドを遅延させることは可能ですか?

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

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

答え1

bash組み込み関数を使用すると、次のことができます。

coproc read -t 10 && wait "$!" || true

使用しないときは、10秒間スリープモードに切り替わりますsleep。目的は、stdinを何も出力しないパイプにcoprocすることです。これは、シャットダウン状態が渡されたSIGALRMを反映し、そのオプションが設定されているとシェルがシャットダウンされるためです。read|| truewaiterrexit

他のシェルでは:

mkshksh93機能が組み込まれているので、他のものを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:3012:31:00minutes, hours, days, or weeksman 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

もちろん、このアプローチの問題は、遅延の長さが異なるシステムのプロセッサ速度に依存することです(または異なる負荷を受ける同じシステムでも同じです)。とは異なり、sleepCPU(またはコアのいずれか)を最大化することもできます。

関連情報