Hvordan køres en kommando i baggrunden med en forsinkelse?

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

  • Ja, jeg er enig, men det kan også være en del af brugerens refleksion; -)
  • Andre svar synes at gå glip af " i baggrunden ". Nej, jeg var ret eksplicit om det: /
  • @goldilocks: Du tilføjede afsendelsen i baggrundsdelen først, efter at jeg sendte mit svar.
  • Nej, mit originale svar var at køre en funktion, der indeholder søvn med & 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
  • @gekannt: … øh, spørgsmålet er " Sådan køres en kommando i baggrunden med en forsinkelse? " – hvordan ville du opnå det ellers? (og nej, hvis du ikke ' t baggrund () gruppen, holder den originale skal pause, indtil den gyde er færdig.)

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *