Jak spustit příkaz na pozadí se zpožděním?

Může mi někdo ukázat, jak vytvořit program pro provedení této akce: po 5 minutách

echo "80" > /sys/class/leds/blue/brightness 

Chci, aby tento program běžel na pozadí (jako služba rngd). Nemohu to udělat, protože o Linuxu toho tolik nevím.

Odpovědět

( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) & 

Tímto způsobem bude pokračovat váš skript nebo okamžitě obnovíte kontrolu, zatímco nový úloha na pozadí skriptu začíná dvěma příkazy: spánkem a echem.

Běžná chyba se pokouší zadat buď sleep nebo echo nebo oba &, které nebudou fungovat podle očekávání. Spuštění řady příkazů v () je však vytvoří v samostatném procesu prostředí, který pak můžete poslat celý na pozadí pomocí &.


K tomu vtipu, kde mi to připadalo aktivně užitečné. Ve vestavěném zařízení vyvíjím tu hlavní aplikaci, která pracuje s hlídacím psem. Pokud selže způsobem, který spustí hlídací pes brzy po spuštění, opakovaně, je těžké jej vzdáleně opravit, protože období mezi spuštěním OS a reset je poměrně krátký, nestačí k ssh a blokování spuštění aplikace. Takže potřebuji způsob, jak určit tak rychle restartovaný systém a zavést zpoždění, pokud ano, abych si dal čas to opravit ručně.

 [ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app 

Pokud přihlaste se a proveďte touch /tmp/noautostart spuštění hlavní aplikace. Pokud se spustí hlídací pes, rm /tmp/startdelay nebude provedeno a další jakmile se systém spustí, dá mi dalších 30 s na zastavení. Jinak bude restart rychlý a bez prodlení.

Komentáře

  • Ano, souhlasím, ale to může být také součástí reflexe uživatele; -)
  • Zdá se, že dalším odpovědím chybí " v pozadí " část. Ne, já bylo to docela jasné: /
  • @goldilocks: Odesílání do části na pozadí jste přidali až poté, co jsem zveřejnil svou odpověď.
  • Ne, moje původní odpověď byla spuštění funkce obsahující spánek s & na pozadí spánku; " je třeba, aby byl režim spánku také " byl v prvním řádku od začátku. Pokud mi ' nevěříte, podívejte se na historii úprav. A moje odpověď je o 5 minut starší než vaše: P
  • @gekannt: … uh, otázka zní " Jak spustit příkaz v pozadí se zpožděním? " – jak byste toho dosáhli jinak? (a ne, pokud ' t na pozadí skupiny (), původní prostředí se pozastaví, dokud nedojde k dokončení.)

Odpověď

použijte příkaz at

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min 

, které běží na pozadí

Komentáře

  • Toto je správný způsob, jak to udělat , ale potřebuje běžícího démona atd. a na většině systémů bude nutné mít nainstalovaný balíček.
  • Abyste se vyhnuli úniku, můžete použít jednoduché uvozovky a vzdát se echo celkem pomocí heredoc nebo herestring.
  • @Julian, at je standardní příkaz POSIX. Jaký unixový systém ho ' ve výchozím nastavení nemá k dispozici?
  • @St é phaneChazelas – dobrá otázka . Vím, že jsem ' měl tento problém, ale bylo to před chvílí. Trochu jsem to zkontroloval a příkaz AT se zdá docela všudypřítomný. Také se zdá, že atd. Je specifický pro Linux a dokonce na některých systémech Linux může být nahrazen cronovým démonem ve stylu BSD. Pojďme ' s považovat můj komentář za zastaralý.
  • Snažil jsem se ' v ' a v systému Android 8 nebyl nalezen žádný příkaz

odpověď

Pokud chcete, aby se něco spustilo v 5 minut, ale zbytek programu, abyste mohli pokračovat (nebo dokončit), musíte také spát na pozadí:

#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello 

Tím se vytiskne hello a poté o 3 sekundy později (po ukončení hlavního programu) vytisknout world.

Důležitou součástí je & vidlice provádění funkce na pozadí.

Komentáře

  • Mohu místo toho navrhnout runWithDelay () { sleep $1; "${@:2}"; }?
  • Myslím, že by si měl ve druhém příkladu přečíst doWhateverWithDelay 3 &.
  • @manatwork: Cheers.
  • @goldilocks, to podstatné při používání $@ je, že jej můžete citovat a bude rozbalen jako seznam citovaných slov. Lepší je tedy "$@" (nebo "${@}", pokud se vám složené závorky líbí).Viz pastebin.com/MU7hbB2C
  • @manatwork: Point taken;) Zkusil jsem to pomocí args s echo (-n), ale očividně to bylo trochu naivní.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *