Kan noen vise meg hvordan jeg lager et program for å gjøre denne handlingen: etter 5 minutter
echo "80" > /sys/class/leds/blue/brightness
Jeg vil at dette programmet skal kjøres i bakgrunnen (som rngd
-tjenesten) Jeg kan ikke gjøre dette fordi jeg ikke vet så mye om Linux.
Svar
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
På den måten fortsetter skriptet ditt, eller du gjenoppretter kontrollen umiddelbart, mens en ny bakgrunnsoppgave i skriptet starter, med to kommandoer: søvn og ekko.
Den vanlige feilen er å prøve å gi enten sleep
eller echo
eller begge &
som ikke fungerer som forutsatt. Lansering av en serie kommandoer i ()
men gyter dem i en egen skallprosess, som du deretter kan sende hele i bakgrunnen med &
.
Til den viten, der jeg fant det aktivt nyttig. I en innebygd enhet som jeg utvikler, er det hovedprogrammet som fungerer med en vakthund. Hvis den mislykkes på en måte som utløser tilbakestillingen av vakthunden raskt etter oppstart, er det vanskelig å fikse eksternt som perioden mellom operativsystemet start og tilbakestillingen er ganske kort, ikke nok til å ssh inn, og blokkere oppstart av appen. Så jeg trenger en måte å bestemme at systemet startes på nytt så raskt og innføre en forsinkelse hvis det gjorde det, å gi meg selv tid til å fikse det manuelt.
[ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app
Hvis jeg logg inn og utfør touch /tmp/noautostart
hovedappen vil ikke starte. Hvis vakthunden sparker inn, vil rm /tmp/startdelay
ikke utføres og neste gang systemet starter, vil det gi meg 30-årene ekstra å stoppe det. Ellers vil omstart være rask, uten forsinkelse.
Kommentarer
Svar
bruk at
-kommandoen
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
som kjører i bakgrunnen
Kommentarer
- Dette er den rette måten å gjøre det på , men det trenger atd-demonen å kjøre, og på de fleste systemer må det være installert en pakke.
- Du kan bruke enkelt anførselstegn for å unngå å rømme, og gå fra
echo
helt ved hjelp av en heredoc eller herring. - @Julian,
at
er en standard POSIX-kommando. Hvilket Unix-lignende system har ' det ikke tilgjengelig som standard? - @St é phaneChazelas – godt spørsmål . Jeg vet at jeg ' har hatt dette problemet, men det var for en stund siden. Jeg sjekket litt, og kommandoen virker ganske allestedsnærværende. Også det virker atd er Linux-spesifikt, og til og med på noen Linux-systemer kan det erstattes av en BSD-stil cron-demon. La ' s vurdere kommentaren min utdatert.
- Jeg prøvde ' på ' og ingen kommando ble funnet på Android 8
Svar
Hvis du vil at noe skal kjøres i 5 minutter, men resten av programmet ditt for å fortsette (eller avslutte), må du også legge bakgrunnen til søvnen:
#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello
Dette vil skrive ut hello
og deretter 3 sekunder senere (etter at hovedprogrammet er avsluttet), skriv ut world
.
Den viktige delen er &
for å forkaste funksjonsutførelsen i bakgrunnen.
Kommentarer
- Kan jeg foreslå
runWithDelay () { sleep $1; "${@:2}"; }
i stedet? - Jeg tror det bør lese
doWhateverWithDelay 3 &
i ditt andre eksempel. - @manatwork: Skål.
- @goldilocks, det essensielle i å bruke
$@
er at du kan sitere det og utvides som en liste over siterte ord. Så gjør det bedre"$@"
(eller"${@}"
hvis du liker seler).Se pastebin.com/MU7hbB2C - @manatwork: Point taken;) Jeg prøvde å bruke args med ekko (
-n
), men det var tydeligvis litt naivt.
&
for å legge bakgrunnen til søvnen; " du må også legge bakgrunnen til søvnen " var i første linje fra begynnelsen. Hvis du ikke tror ', se på redigeringsloggen. Og svaret mitt er 5 minutter eldre enn ditt: P()
-gruppen, vil det originale skallet ta pause til den gyte er ferdig.)