web-dev-qa-db-ja.com

コマンドを遅延してバックグラウンドで実行するにはどうすればよいですか?

このアクションを実行するプログラムの作成方法を誰かに教えてもらえますか:5分後

echo "80" > /sys/class/leds/blue/brightness

このプログラムを(rngdサービスのように)バックグラウンドで実行したいのですが、Linuxについてあまり知らないので、これを行うことはできません。

34
user53337
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &

このようにして、スクリプトを続行するか、すぐに制御を復元しますが、スクリプトの新しいバックグラウンドタスクが開始し、sleepとechoの2つのコマンドを使用します。

一般的なエラーは、sleepechoのいずれか、または両方を&に指定しようとしていますが、意図したとおりに機能しません。一連のコマンドを()で起動すると、別のシェルプロセスで生成されます。その後、&を使用して、全体をバックグラウンドに送信できます。


その機知に、私はそれが積極的に役立つと思いました。私が開発した組み込みデバイスには、ウォッチドッグで動作するメインアプリケーションがあります。起動直後に繰り返しウォッチドッグリセットをトリガーするような方法で失敗する場合、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秒かかります。それ以外の場合、再起動は遅延することなく、迅速になります。

56
SF.

atコマンドを使用する

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min

バックグラウンドで実行されます

11
exussum

5分で何かを実行したいが、プログラムの残りの部分を続行(または終了)する場合は、スリープもバックグラウンドで実行する必要があります。

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

これはhelloを出力し、3秒後(メインプログラムが終了した後)にworldを出力します。

重要な部分は&関数の実行をバックグラウンドにフォークします。

6
goldilocks