Kan nogen vise mig, hvordan jeg laver et program til denne handling: efter 5 minutter
echo "80" > /sys/class/leds/blue/brightness
Jeg vil have dette program kørt i baggrunden (som rngd
-tjenesten) Jeg kan ikke gøre dette, fordi jeg ikke ved så meget om Linux.
Svar
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
På den måde fortsætter dit script, eller du gendanner kontrollen med det samme, mens en ny baggrundsopgave i scriptet starter med to kommandoer: søvn og ekko.
Den almindelige fejl forsøger at give enten sleep
eller echo
eller begge &
som ikke fungerer som beregnet. Lancering af en række kommandoer i ()
men skaber dem i en separat shell-proces, som du derefter kan sende hele i baggrunden med &
.
Til det vidunder, hvor jeg fandt det aktivt nyttigt. I en indlejret enhed udvikler jeg der hovedapplikationen, der fungerer med en vagthund. Hvis den mislykkes på en måde, der udløser overvågning af vagthund hurtigt efter opstart, gentagne gange, er det svært at lave eksternt som perioden mellem OS start og nulstillingen er ret kort, ikke nok til at ssh ind og blokere appens opstart. Så jeg har brug for en måde at bestemme, at systemet genstartes så hurtigt og indføre en forsinkelse, hvis det gjorde det, at give mig tid til at rette det manuelt.
[ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app
Hvis jeg log ind og udfør touch /tmp/noautostart
hovedappen vandt ikke start. Hvis vagthunden sparker ind, udføres rm /tmp/startdelay
ikke og den næste gang systemet starter, vil det give mig ekstra 30ere at stoppe det. Ellers vil genstart hurtigt ske uden forsinkelse.
Kommentarer
Svar
brug at
kommandoen
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
der kører i baggrunden
Kommentarer
- Dette er den rigtige måde at gøre det på , men det har brug for atd-dæmonen, der kører, og på de fleste systemer skal der være installeret en pakke.
- Du kan bruge enkelt anførselstegn for at undgå at undslippe og give afkald på
echo
helt ved hjælp af en heredoc eller herestring. - @Julian,
at
er en standard POSIX-kommando. Hvilket Unix-lignende system har ' det ikke som standard? - @St é phaneChazelas – godt spørgsmål . Jeg ved, at jeg ' har haft dette problem, men det var for et stykke tid siden. Jeg tjekkede lidt, og kommandoen at virker ret allestedsnærværende. Det ser også ud til, atd er Linux-specifik, og selv på nogle Linux-systemer kan det erstattes af en BSD-stil cron-dæmon. Lad ' s betragte min kommentar forældet.
- Jeg prøvede ' ved ' og der blev ikke fundet nogen kommando på Android 8
Svar
Hvis du vil have noget at køre i 5 minutter, men resten af dit program for at fortsætte (eller afslutte), skal du også søvn i baggrunden:
#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello
Dette udskriver hello
og derefter 3 sekunder senere (efter at hovedprogrammet er afsluttet), skal du udskrive world
.
Den vigtige del er &
for at forkaste funktionens udførelse i baggrunden.
Kommentarer
- Må jeg foreslå
runWithDelay () { sleep $1; "${@:2}"; }
i stedet? - Jeg synes det skal læse
doWhateverWithDelay 3 &
i dit andet eksempel. - @manatwork: Skål.
- @goldilocks, det væsentlige ved brug af
$@
er, at du kan citere det og vil blive udvidet som en liste over citerede ord. Så gør det bedre"$@"
(eller"${@}"
, hvis du kan lide seler).Se pastebin.com/MU7hbB2C - @manatwork: Punkt taget;) Jeg prøvede at bruge args med ekko (
-n
), men det var naturligvis lidt naivt.
&
som baggrund for søvn; " skal du også baggrunde søvn " var i første linje fra starten. Hvis du ikke ' ikke tror på mig, skal du se på redigeringshistorikken. Og mit svar er 5 minutter ældre end dit: P()
gruppen, holder den originale skal pause, indtil den gyde er færdig.)