Hoe voer je een opdracht met vertraging uit op de achtergrond?

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

  • Ja, ik ga akkoord, maar dat kan ook deel uitmaken van de gebruikersreflectie; -)
  • Andere antwoorden lijken het " op de achtergrond " deel te missen. Nee, ik was daar vrij expliciet over: /
  • @goldilocks: je voegde het verzenden naar het achtergrondgedeelte pas toe nadat ik mijn antwoord had gepost.
  • Nee, mijn oorspronkelijke antwoord was om een functie uit te voeren die slaap bevat met & 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
  • @gekannt: … uh, de vraag is " Hoe een commando in de achtergrond met een vertraging? " – hoe zou je het anders bereiken? (en nee, als je ' t de () groep op de achtergrond zet, zal de originele shell pauzeren totdat de spawned is voltooid.)

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *