バックグラウンドでコマンドを遅延して実行する方法は?


33

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

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

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

回答:


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

この方法で、スクリプトを続行するか、すぐに制御を復元しますが、スクリプトの新しいバックグラウンドタスクは、スリープとエコーの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秒余分に与えられます。そうでない場合、再起動は遅延なく迅速に行われます。


はい、同意しますが、それはユーザーの反省の一部でもあります
;

他の答えは、「バックグラウンド」の部分を見逃しているようです。 いいえ、私はそれについてかなり明確でした:/
goldilocks

@goldilocks:回答を投稿した後にのみ、バックグラウンドへの送信を追加しました。
SF。

いいえ、私の最初の答えは&、スリープをバックグラウンドにするスリープを含む関数を実行することでした。「睡眠もバックグラウンドにする必要があります」は最初から最初の行にありました。私を信じないなら、編集履歴を見てください。そして、私の答えはあなたより5分古いです:P
goldilocks

1
@gekannt:...ええと、質問は「遅れてコマンドをバックグラウンドで実行する方法?」です。-それ以外の場合はどのように達成しますか?(いいえ、()グループをバックグラウンドにしない場合、生成されたシェルが終了するまで元のシェルは一時停止します。)
SF。

11

atコマンドを使用する

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

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


2
これは正しい方法ですが、atdデーモンを実行する必要があり、ほとんどのシステムではパッケージをインストールする必要があります。
ジュリアン

エスケープを回避するために単一引用符をecho使用し、heredocまたはherestringを使用することで完全に先送りできます。
クリスダウン

@Julian atは、標準のPOSIXコマンドです。デフォルトで利用できないUnixライクなシステムは何ですか?
ステファンシャゼラス

1
@StéphaneChazelas-いい質問です。私はこの問題を抱えていたことを知っていますが、それは少し前のことです。私は少しチェックをしましたが、atコマンドはかなり遍在しているようです。また、atdはLinux固有であり、一部のLinuxシステムでもBSDスタイルのcronデーモンに置き換えられる可能性があります。私のコメントは時代遅れだと考えてみましょう。
ジュリアン

「at」を試しましたが、Android 8でコマンドが見つかりませんでした
beppe9000

6

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

#!/bin/bash

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

runWithDelay 3 echo world &
echo hello    

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

重要な部分は、&関数実行をバックグラウンドに分岐することです。


1
runWithDelay () { sleep $1; "${@:2}"; }代わりに提案してもいいですか?
マナトワーク

1
doWhateverWithDelay 3 &2番目の例で読むべきだと思います。
バールン

@manatwork:乾杯。
goldilocks

1
@goldilocksを使用する上で不可欠なの$@は、それを引用できることであり、引用された単語のリストとして展開されます。だから、それを作るのが良いでしょう"$@"(または"${@}"、ブレースが好きなら)。参照pastebin.com/MU7hbB2C
manatwork

@manatwork:要点;)echo(-n)でargsを使用して試しましたが、明らかにそれは少し素朴でした。
goldilocks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.