Hvordan kjøre en kommando i bakgrunnen med forsinkelse?

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

  • Ja, jeg er enig, men det kan også være en del av brukerrefleksjonen; -)
  • Andre svar ser ut til å savne " i bakgrunnen " -delen. Nei, jeg var ganske eksplisitt om det: /
  • @goldilocks: Du la først sendingen til bakgrunnsdelen etter at jeg la ut svaret.
  • Nei, mitt opprinnelige svar var å kjøre en funksjon som inneholder søvn med & 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
  • @gekannt: … øh, spørsmålet er " Hvordan kjøre en kommando i bakgrunnen med forsinkelse? " – hvordan ville du oppnå det ellers? (og nei, hvis du ikke ' t bakgrunn () -gruppen, vil det originale skallet ta pause til den gyte er ferdig.)

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *