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
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.
&
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()
-gruppen, kommer det ursprungliga skalet att pausa tills den gyte är klar.)