Cum se execută o comandă în fundal cu o întârziere?

Poate cineva să-mi arate cum să fac un program pentru a face această acțiune: după 5 minute

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

Vreau ca acest program să ruleze în fundal (cum ar fi serviciul rngd) Nu pot face acest lucru, deoarece nu știu atât de multe despre Linux.

Răspuns

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

În acest fel, scriptul dvs. continuă sau restabiliți controlul imediat, în timp ce un nou task de fundal al scriptului începe, cu două comenzi: sleep și echo.

Eroarea obișnuită încearcă să dea fie sleep, fie echo sau ambele & care nu vor funcționa conform intenției. Lansarea unei serii de comenzi în () deși le generează într-un proces shell separat, pe care îl puteți trimite apoi întreg în fundal cu &.


Pentru acest spirit, unde l-am găsit util în mod activ. Într-un dispozitiv încorporat pe care îl dezvolt, există aplicația principală care funcționează cu un câine de supraveghere. Dacă eșuează într-un mod care declanșează resetarea câinelui de supraveghere la scurt timp după pornire, în mod repetat, este greu de remediat de la distanță pe măsură ce perioada dintre pornirea sistemului de operare și resetarea este destul de scurtă, nu este suficientă pentru a intra și a bloca pornirea aplicației. Așadar, am nevoie de o modalitate de a determina repornirea sistemului atât de repede și de a introduce o întârziere dacă a făcut-o, pentru a-mi acorda timp pentru a o repara manual.

 [ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app 

Dacă conectați-vă și efectuați touch /tmp/noautostart aplicația principală nu va începe. Dacă câinele de supraveghere începe, rm /tmp/startdelay nu va fi efectuat și următorul când sistemul pornește, îmi va oferi 30 de ani în plus să-l opresc. În caz contrar, repornirea va fi rapidă, fără întârziere.

Comentarii

  • Da, sunt de acord, dar acest lucru poate face parte și din reflecția utilizatorului; -)
  • Alte răspunsuri par să rateze partea " din fundal ". Nu, eu a fost destul de explicit despre asta: /
  • @goldilocks: Ați adăugat trimiterea în partea de fundal numai după ce am postat răspunsul meu.
  • Nu, răspunsul meu inițial a fost să rulez o funcție care conține somn cu & pentru a fundala somnul; " trebuie să fundalizați somnul, precum și " a fost în prima linie de la început. Dacă nu ' mă credeți, uitați-vă la istoricul editării. Și răspunsul meu este cu 5 minute mai vechi decât al tău: P
  • @gekannt: … uh, întrebarea este " Cum se execută o comandă în fundalul cu o întârziere? " – cum l-ați realiza altfel? (și nu, dacă nu aveți ' t fundal în grupul (), shell-ul original se va întrerupe până când se va termina cel generat.)

Răspuns

utilizați comanda at

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

care va rula în fundal

Comentarii

  • Acesta este modul corect de a o face , dar are nevoie de daemonul ATD care rulează și pe majoritatea sistemelor va trebui să existe un pachet instalat.
  • Puteți utiliza ghilimele unice pentru a evita scăparea și renunțați la echo cu totul utilizând un heredoc sau herestring.
  • @Julian, at este o comandă POSIX standard. Ce sistem Unix-like nu ' îl are disponibil în mod implicit?
  • @St é phaneChazelas – întrebare bună . Știu că ' am avut această problemă, dar a fost acum ceva timp. Am făcut o mică verificare și comanda de la mi se pare destul de omniprezentă. De asemenea, se pare că ATD este specific Linux și chiar și pe unele sisteme Linux pot fi înlocuite cu un daemon cron în stil BSD. Să ' considerăm comentariul meu depășit.
  • Am încercat ' la ' și nu s-a găsit nicio comandă pe Android 8

Răspunde

Dacă vrei să ruleze ceva în 5 minute, dar restul programului dvs. pentru a continua (sau a termina), trebuie să faceți și fundalul somnului:

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

Aceasta va imprima hello și apoi 3 secunde mai târziu (după ce programul principal a ieșit), tipăriți world.

Partea importantă este & pentru a introduce execuția funcției în fundal.

Comentarii

  • În schimb, pot sugera runWithDelay () { sleep $1; "${@:2}"; }?
  • Cred că ar trebui să citiți doWhateverWithDelay 3 & în al doilea exemplu.
  • @manatwork: Noroc.
  • @goldilocks, esențial în utilizarea $@ este că îl puteți cita și va fi extins ca listă de cuvinte citate. Deci, mai bine faceți-l "$@" (sau "${@}" dacă vă plac parantezele).Vedeți pastebin.com/MU7hbB2C
  • @manatwork: Punct luat;) Am încercat să folosesc args cu echo (-n), dar evident că a fost cam naiv.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *