Kan iemand me laten zien hoe ik een programma kan maken om deze actie uit te voeren: na 5 minuten
echo "80" > /sys/class/leds/blue/brightness
Ik wil dat dit programma op de achtergrond draait (zoals rngd
service). Ik kan dit niet doen omdat ik niet zoveel weet over Linux.
Antwoord
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
Op die manier gaat je script verder, of je herstelt de controle onmiddellijk, terwijl een nieuwe achtergrondtaak van het script start, met twee commandos: slaap en echo.
De veel voorkomende fout is om sleep
of echo
of beide &
die niet zullen werken zoals bedoeld. Door een reeks commandos te starten in ()
, worden ze echter in een apart shell-proces uitgezet, dat je vervolgens geheel naar de achtergrond kunt sturen met &
.
Tot die geest, waar ik het actief nuttig vond. In een ingebed apparaat dat ik ontwikkel, is er de hoofdtoepassing die werkt met een watchdog. Als het niet lukt op een manier die ervoor zorgt dat de watchdog snel na het opstarten wordt gereset, is het moeilijk op afstand te repareren, aangezien de periode tussen het opstarten van het besturingssysteem en de reset is vrij kort, niet genoeg om in te sshen en het opstarten van de app te blokkeren. Dus ik heb een manier nodig om te bepalen of het systeem zo snel opnieuw is opgestart en een vertraging in te voeren als dat het geval is, om mezelf de tijd te geven om het handmatig te repareren.
[ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app
Als ik log in en voer touch /tmp/noautostart
uit. De hoofdapp start niet. Als de waakhond begint, wordt rm /tmp/startdelay
niet uitgevoerd en de volgende als het systeem start, krijg ik 30 seconden extra om het te stoppen. Anders zal het herstarten snel zijn, zonder vertraging.
Opmerkingen
Answer
gebruik het at
commando
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
die op de achtergrond wordt uitgevoerd
Reacties
- Dit is de juiste manier om het te doen , maar de atd-daemon moet worden uitgevoerd en op de meeste systemen moet een pakket zijn geïnstalleerd.
- U kunt enkele aanhalingstekens gebruiken om ontsnapping te voorkomen, en afzien van
echo
helemaal door een heredoc of herestring te gebruiken. - @Julian,
at
is een standaard POSIX-commando. Welk Unix-achtig systeem heeft het niet ' niet standaard beschikbaar? - @St é phaneChazelas – goede vraag . ik weet dat ik ' dit probleem heb gehad, maar het is een tijdje geleden. Ik heb het een beetje gecontroleerd en het commando lijkt behoorlijk alomtegenwoordig. Het lijkt er ook op dat atd Linux-specifiek is en zelfs op sommige Linux-systemen kan worden vervangen door een cron-daemon in BSD-stijl. Laten we ' s mijn opmerking als verouderd beschouwen.
- Ik heb ' geprobeerd op ' en er is geen commando gevonden op Android 8
Answer
Als je iets wilt uitvoeren in 5 minuten, maar voor de rest van je programma om door te gaan (of te eindigen), moet je de slaap ook op de achtergrond zetten:
#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello
Dit zal hello
en 3 seconden later (nadat het hoofdprogramma is afgesloten), print world
.
Het belangrijkste deel is de &
om de uitvoering van de functie naar de achtergrond te splitsen.
Opmerkingen
- Mag ik in plaats daarvan
runWithDelay () { sleep $1; "${@:2}"; }
voorstellen? - Ik denk het zou
doWhateverWithDelay 3 &
moeten lezen in je tweede voorbeeld. - @manatwork: Cheers.
- @goldilocks, het essentiële bij het gebruik van
$@
is dat u het kunt citeren en zal worden uitgebreid als een lijst met geciteerde woorden. Dus maak het maar beter"$@"
(of"${@}"
als je van accolades houdt).Zie pastebin.com/MU7hbB2C - @manatwork: Point taken;) Ik heb dat geprobeerd met args met echo (
-n
), maar dat was duidelijk een beetje naïef.
&
als achtergrond voor de slaap; " je moet de slaap ook op de achtergrond hebben. " stond vanaf het begin in de eerste regel. Als je me niet ' gelooft, kijk dan naar de bewerkingsgeschiedenis. En mijn antwoord is 5 minuten ouder dan het jouwe: P()
groep op de achtergrond zet, zal de originele shell pauzeren totdat de spawned is voltooid.)