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
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.
&
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()
, shell-ul original se va întrerupe până când se va termina cel generat.)