Hur kör jag ett kommando i bakgrunden med fördröjning?

Kan någon visa mig hur man gör ett program för att göra den här åtgärden: efter 5 minuter

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

Jag vill att det här programmet ska köras i bakgrunden (som rngd -tjänsten) Jag kan inte göra det eftersom jag inte vet så mycket om Linux.

Svar

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

På så sätt fortsätter ditt skript, eller så återställer du kontrollen omedelbart, medan en ny bakgrundsuppgift i skriptet börjar med två kommandon: viloläge och eko.

Det vanliga felet är att försöka ge antingen sleep eller echo eller båda & som inte fungerar som avsett. Starta en serie kommandon i () men spottar dem i en separat skalprocess, som du sedan kan skicka hela till bakgrunden med &.


På det sättet, där jag tyckte att det var aktivt användbart. I en inbäddad enhet utvecklar jag det huvudsakliga programmet som fungerar med en vakthund. Om det misslyckas på ett sätt som utlöser vakthundsåterställningen snart efter start, upprepade gånger, är det svårt att fixa på distans som perioden mellan OS-start och återställningen är ganska kort, inte tillräckligt för att ssh in, och blockera appens start. Så jag behöver ett sätt att bestämma att systemet startas om så snabbt och införa en fördröjning om det gjorde det, att ge mig tid att fixa det manuellt.

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

Om jag logga in och utför touch /tmp/noautostart huvudappen kommer inte att starta. Om vakthunden sparkar in kommer rm /tmp/startdelay inte att utföras och nästa när systemet startar kommer det att ge mig 30-talet extra att stoppa det. Annars går omstart snabbt, utan dröjsmål.

Kommentarer

  • Ja, jag håller med, men det kan också vara en del av användarens reflektion; -)
  • Andra svar verkar sakna " i bakgrunden ". Nej, jag var ganska tydlig om det: /
  • @goldilocks: Du lade till sändningen i bakgrundsdelen först efter att jag publicerade mitt svar.
  • Nej, mitt ursprungliga svar var att köra en funktion som innehåller sömn med & som bakgrund till sömnen; " du måste också sova i bakgrunden " var i första raden från början. Om du inte tror ', se redigeringshistoriken. Och mitt svar är 5 minuter äldre än ditt: P
  • @gekannt: … öh, frågan är " Hur man kör ett kommando i bakgrunden med en fördröjning? " – hur skulle du uppnå det annars? (och nej, om du inte ' t bakgrund () -gruppen, kommer det ursprungliga skalet att pausa tills den gyte är klar.)

Svar

använd kommandot at

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

som körs i bakgrunden

Kommentarer

  • Detta är rätt sätt att göra det , men den behöver atd-demonen köras och på de flesta system måste ett paket installeras.
  • Du kan använda enstaka citat för att undvika att fly, och avstå från echo helt och hållet med en heredoc eller herring.
  • @Julian, at är ett vanligt POSIX-kommando. Vilket Unix-liknande system har ' det inte tillgängligt som standard?
  • @St é phaneChazelas – bra fråga . Jag vet att jag ' har haft det här problemet men det var för ett tag sedan. Jag gjorde lite kontroll och at-kommandot verkar ganska allestädes närvarande. Det verkar också att atd är Linuxspecifikt och till och med på vissa Linux-system kan det ersättas med en BSD-stil cron-demon. Låt ' betrakta min kommentar föråldrad.
  • Jag försökte ' vid ' och inget kommando hittades på Android 8

Svar

Om du vill att något ska köras i 5 minuter, men resten av programmet för att fortsätta (eller avsluta) måste du också sova i bakgrunden:

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

Detta kommer att skriva ut hello och sedan tre sekunder senare (efter att huvudprogrammet har avslutats), skriv ut world.

Den viktiga delen är & för att dela upp funktionens utförande i bakgrunden.

Kommentarer

  • Får jag föreslå runWithDelay () { sleep $1; "${@:2}"; } istället?
  • Jag tror det ska läsa doWhateverWithDelay 3 & i ditt andra exempel.
  • @manatwork: Skål.
  • @goldilocks, det väsentliga i att använda $@ är att du kan citera det och kommer att utökas som en lista över citerade ord. Så gör det bättre "$@" (eller "${@}" om du gillar hängslen).Se pastebin.com/MU7hbB2C
  • @manatwork: Point taken;) Jag försökte att använda args med echo (-n), men det var uppenbarligen lite naivt.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *