Wykonaj polecenie po kilku sekundach (bez uśpienia)

15

Jak mogę uruchomić polecenie po X sekundach bez snu? Lub ze snem, ale bez powłoki po prostu czekaj na odpowiedź na to polecenie?

Użyłem tego, ale to nie działało

sleep 5 ; ls > a.txt

Muszę uruchomić to w tle. Staram się nie uruchamiać go w skrypcie, próbuję uruchomić lspo 5 sekundach, a powłoka nie tylko czeka na koniec snu

Jaskółka oknówka
źródło
Dlaczego to nie działa bez powłoki? Jaki masz błąd? Czy mijasz pełną ścieżkę? Czy wiesz, która część analizuje ;?
Hennes,
w ten sposób powłoka zablokuje 5 sekund, a następnie uruchomi polecenie., powłoka do zablokowania Nie potrzebuję tego.
Martin
Następnie musisz uruchomić go w skrypcie w tle lub w podpowłoce.
Hennes

Odpowiedzi:

34

Bardziej zwięzłym sposobem pisania jest to, co zasugerował Hennes

(sleep 5; echo foo) & 

Alternatywnie, jeśli potrzebujesz więcej niż kilku sekund, możesz użyć at. Istnieją trzy sposoby wydawania poleceń at:

  1. Potokuj:

    $ echo "ls > a.txt" | at now + 1 min
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  2. Zapisz polecenie, które chcesz uruchomić, w pliku tekstowym, a następnie przekaż ten plik do at:

    $ echo "ls > a.txt" > cmd.txt
    $ at now + 1 min < cmd.txt
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  3. Możesz także przekazywać atpolecenia ze STDIN:

    $ at now + 1 min
    warning: commands will be executed using /bin/sh
    at> ls
    

    Następnie naciśnij, CtrlDaby wyjść z atpowłoki. lsKomenda zostanie uruchomiony w ciągu jednej minuty.

Możesz podać bardzo dokładne czasy w formacie [[CC]YY]MMDDhhmm[.ss], jak w

$ at -t 201412182134.12 < script.sh

Spowoduje to uruchomienie skryptu script.sho 21:34 i 12 sekundach 18 grudnia 2014 r. Więc teoretycznie możesz użyć atdo uruchomienia czegoś w ciągu pięciu sekund w przyszłości. Jest to jednak trochę jak użycie czołgu do ciosu muchy, a sugestia Hennesa jest lepsza.

terdon
źródło
Ciągle się z tym bałagałem. $(sleep 5; echo foo) &Nie jestem pewien, dlaczego myślałem, że potrzebuję $ przed tym, ale z powodu mojej błędnej składni właśnie opublikowałem dłuższą (i bardziej zrozumiałą) wersję. (Command_for_in_new_shell) jest jednak krótszy.
Hennes
@Hennes i ja rażąco wyszarpnęliśmy z twojego bardzo dobrego pomysłu (którego głosowałem). Wszystko, co zrobiłem, to sformatowanie go tak, aby było krótsze, wszystkie zasługi za rzeczywiste myślenie należą do ciebie :).
terdon
Czy jest jakiś sposób na użycie atz opóźnieniem w kilka sekund?
Pozew Fund Moniki z
@NicHartley no. Użyj określonego czasu (np. at 21:43), Jeśli tego chcesz, lub po prostu zrób coś prostego, np. sleep 4 && commandUruchom commandpo 4 sekundach.
terdon
4

Możesz obejść ten problem, uruchamiając powłokę lub skrypt w tle.

Przykład:

/ bin / sh -c "sleep 5; echo foo" &
[1] 63791
> Aktywny monit powłoki tutaj

foo 5 sekund później pojawia się wyjście.
Hennes
źródło