Jak uruchomić polecenie w tle z opóźnieniem?

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

  • Tak, zgadzam się, ale może to być również częścią refleksji użytkownika; -)
  • W innych odpowiedziach brakuje części " w tle ". Nie, ja był o tym dość wyraźny: /
  • @goldilocks: Dodałeś wysyłanie w tle dopiero po wysłaniu mojej odpowiedzi.
  • Nie, moja pierwotna odpowiedź polegała na uruchomieniu funkcji zawierającej uśpienie z & 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
  • @gekannt: … uh, pytanie brzmi " Jak uruchomić polecenie w tło z opóźnieniem? " – jak inaczej byś to osiągnął? (i nie, jeśli nie ' w tle grupy (), oryginalna powłoka zatrzyma się do czasu zakończenia utworzonej powłoki).

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *