Czy ktoś może mi pokazać, jak zrobić program wykonujący tę czynność: po 5 minutach
echo "80" > /sys/class/leds/blue/brightness
Chcę, aby ten program działał w tle (jak usługa rngd
). Nie mogę tego zrobić, ponieważ nie wiem zbyt wiele o Linuksie.
Odpowiedź
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
W ten sposób skrypt będzie kontynuowany lub natychmiast przywrócisz kontrolę, gdy nowy zadanie w tle uruchamia się skryptu, z dwoma poleceniami: sleep i echo.
Typowym błędem jest próba podania sleep
lub echo
lub oba &
, które nie będą działać zgodnie z oczekiwaniami. Uruchomienie serii poleceń w ()
, ale powoduje ich utworzenie w oddzielnym procesie powłoki, który można następnie wysłać w tle w całości za pomocą &
.
Do tego dowcipu, w którym okazało się, że jest aktywnie przydatny. W opracowanym przeze mnie urządzeniu wbudowanym znajduje się główna aplikacja, która współpracuje z watchdoga. Jeśli zawiedzie w sposób, który powoduje wielokrotne resetowanie watchdoga wkrótce po uruchomieniu, trudno jest naprawić zdalnie, ponieważ okres między uruchomieniem systemu operacyjnego a reset jest dość krótki, niewystarczający, aby włączyć ssh i zablokować uruchamianie aplikacji. Dlatego potrzebuję sposobu, aby określić, czy system został uruchomiony ponownie tak szybko i wprowadzić opóźnienie, jeśli tak się stało, aby dać sobie czas na ręczną naprawę.
[ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app
Jeśli zaloguj się i wykonaj touch /tmp/noautostart
główna aplikacja nie zostanie uruchomiona. Jeśli strażnik włączy się, rm /tmp/startdelay
nie zostanie wykonany, a następny gdy system się uruchomi, zatrzymanie go da mi dodatkowe 30 sekund. W przeciwnym razie ponowne uruchomienie nastąpi szybko i bez opóźnień.
Komentarze
Odpowiedź
użyj polecenia at
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
który będzie działał w tle
Komentarze
- To jest właściwy sposób na zrobienie tego , ale wymaga uruchomionego demona atd, a na większości systemów będzie musiał mieć zainstalowany pakiet.
- Możesz użyć apostrofów, aby uniknąć zmiany znaczenia i zrezygnować z
echo
używając heredoc lub herestring. - @Julian,
at
to standardowe polecenie POSIX. Który system typu uniksowego nie ' nie ma go domyślnie? - @St é phaneChazelas – dobre pytanie . Wiem, że ' miałem ten problem, ale to było jakiś czas temu. Sprawdziłem trochę i komenda wydaje się dość wszechobecna. Wydaje się również, że atd jest specyficzny dla Linuksa i nawet w niektórych systemach Linux może być zastąpiony demonem cron w stylu BSD. Niech ' uznają mój komentarz za nieaktualny.
- Próbowałem ' pod adresem ' i nie znaleziono polecenia w systemie Android 8
Odpowiedź
Jeśli chcesz, aby coś działało w 5 minut, ale reszta programu, aby kontynuować (lub zakończyć), również musisz ustawić tryb uśpienia w tle:
#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello
Spowoduje to wydrukowanie hello
, a następnie 3 sekundy później (po zamknięciu głównego programu) wypisz world
.
Ważną częścią jest &
, aby rozwidlić wykonywanie funkcji w tle.
Komentarze
- Czy mogę zamiast tego zaproponować
runWithDelay () { sleep $1; "${@:2}"; }
? - Myślę, że tak powinien przeczytać
doWhateverWithDelay 3 &
w drugim przykładzie. - @manatwork: Cheers.
- @goldilocks, najważniejsze w używaniu
$@
jest taki, że możesz go zacytować i zostanie rozwinięty jako lista cytowanych słów. Dlatego lepiej zrób to"$@"
(lub"${@}"
, jeśli lubisz nawiasy klamrowe).Zobacz pastebin.com/MU7hbB2C - @manatwork: Punkt zajęty;) Próbowałem tego używając argumentów z echo (
-n
), ale oczywiście było to trochę naiwne.
&
do uśpienia w tle; " musisz również ustawić tryb uśpienia w tle, " znajdował się w pierwszej linii od początku. Jeśli ' mi nie wierzysz, spójrz na historię zmian. A moja odpowiedź jest o 5 minut starsza od Twojej: P()
, oryginalna powłoka zatrzyma się do czasu zakończenia utworzonej powłoki).