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
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í.
&
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()
, původní prostředí se pozastaví, dokud nedojde k dokončení.)