回答:
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
この方法で、スクリプトを続行するか、すぐに制御を復元しますが、スクリプトの新しいバックグラウンドタスクは、スリープとエコーの2つのコマンドで開始されます。
一般的なエラーは、意図したとおりに動作しないいずれsleep
かecho
または両方を提供しようとしています&
。一連のコマンドを()
起動すると、それらは別個のシェルプロセスで生成されます&
。その後、を使用して全体をバックグラウンドに送信できます。
その機知に、私はそれが積極的に有用だと感じたところ。私が開発した組み込みデバイスには、ウォッチドッグで動作するメインアプリケーションがあります。起動直後にウォッチドッグリセットをトリガーする方法で繰り返し失敗した場合、OSの起動からリセットまでの期間が非常に短く、sshで十分ではなく、アプリの起動をブロックするため、リモートで修正するのは困難です。したがって、手動で修正する時間を与えるために、システムの再起動が非常に高速であると判断し、遅延が発生した場合は遅延を導入する方法が必要です。
[ -f /tmp/startdelay ] && sleep 30
touch /tmp/startdelay
( sleep 30 ; rm /tmp/startdelay ) &
[ -f /tmp/noautostart ] && exit 0
start_app
ログインして実行するとtouch /tmp/noautostart
、メインアプリが起動しません。ウォッチドッグがrm /tmp/startdelay
作動し、実行されず、次にシステムが起動する場合、それを停止するために30秒余分に与えられます。そうでない場合、再起動は遅延なく迅速に行われます。
&
、スリープをバックグラウンドにするスリープを含む関数を実行することでした。「睡眠もバックグラウンドにする必要があります」は最初から最初の行にありました。私を信じないなら、編集履歴を見てください。そして、私の答えはあなたより5分古いです:P
()
グループをバックグラウンドにしない場合、生成されたシェルが終了するまで元のシェルは一時停止します。)
at
コマンドを使用する
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
バックグラウンドで実行されます
echo
使用し、heredocまたはherestringを使用することで完全に先送りできます。
at
は、標準のPOSIXコマンドです。デフォルトで利用できないUnixライクなシステムは何ですか?
5分で何かを実行したいが、プログラムの残りの部分を続行(または終了)したい場合は、スリープもバックグラウンドにする必要があります。
#!/bin/bash
runWithDelay () {
sleep $1;
shift;
"${@}";
}
runWithDelay 3 echo world &
echo hello
これは印刷hello
し、3秒後(メインプログラムが終了した後)に印刷しますworld
。
重要な部分は、&
関数実行をバックグラウンドに分岐することです。
runWithDelay () { sleep $1; "${@:2}"; }
代わりに提案してもいいですか?
doWhateverWithDelay 3 &
2番目の例で読むべきだと思います。
$@
は、それを引用できることであり、引用された単語のリストとして展開されます。だから、それを作るのが良いでしょう"$@"
(または"${@}"
、ブレースが好きなら)。参照pastebin.com/MU7hbB2C
-n
)でargsを使用して試しましたが、明らかにそれは少し素朴でした。