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

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

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

このプログラムをバックグラウンドで実行したい(rngdサービスなど)Linuxについてあまり詳しくないため、これを実行できません。

回答

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

これにより、スクリプトを続行するか、新しい<スクリプトのem>バックグラウンドタスクは、sleepとechoの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秒余分にかかります。それ以外の場合、再起動は遅滞なく迅速に行われます。

コメント

  • はい、同意しますが、それはユーザーの反省の一部にもなり得ます;-)
  • 他の回答はバックグラウンド"の部分の"を見逃しているようです。いいえ、私はそれについてはかなり明確でした:/
  • @goldilocks:回答を投稿した後でのみ、送信をバックグラウンド部分に追加しました。
  • いいえ、元の回答はスリープを含む関数を実行することでした。 &を使用して睡眠をバックグラウンドにします。 "睡眠もバックグラウンドで行う必要があります" は最初から最初の行にありました。 '信じられない場合は、編集履歴をご覧ください。そして、私の答えはあなたの答えより5分古いです:P
  • @gekannt:…ええと、質問は"コマンドをで実行する方法です背景に遅れがありますか?"-それ以外の場合、どのように達成しますか? (いいえ、' ()グループをバックグラウンドにしないと、元のシェルは生成されたシェルが終了するまで一時停止します。)

回答

atコマンドを使用

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

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

コメント

  • これは正しい方法です、ただし、atdデーモンを実行する必要があり、ほとんどのシステムではパッケージをインストールする必要があります。
  • 一重引用符を使用してエスケープを回避し、echoヒアドキュメントまたはherestringを使用します。
  • @Julian、atは標準のPOSIXコマンドです。どのUnixライクなシステムがデフォルトで利用できない'?
  • @St é phaneChazelas-良い質問。 'この問題が発生したことは知っていますが、少し前のことです。私は少しチェックしましたが、atコマンドはかなり遍在しているようです。また、atdはLinux固有であり、一部のLinuxシステムでもBSDスタイルのcronデーモンに置き換えられる可能性があるようです。 'コメントが古くなっていると考えてみましょう。
  • ' at 'でAndroid8にコマンドが見つかりませんでした

回答

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

#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello 

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

重要な部分は

は、関数の実行をバックグラウンドにフォークします。

コメント

  • 代わりにrunWithDelay () { sleep $1; "${@:2}"; }を提案してもいいですか?
  • そう思います2番目の例ではdoWhateverWithDelay 3 &と読む必要があります。
  • @manatwork:乾杯。
  • @goldilocks、は、引用することができ、引用された単語のリストとして展開されることです。したがって、"$@"(または中かっこが好きな場合は"${@}")にする方がよいでしょう。 pastebin.com/MU7hbB2C
  • を参照してください。 9743b98428 “>

)、しかし明らかにそれは少し素朴でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です