Czy istnieje sposób na zapewnienie zadań szeregowych na terminalu podczas wykonywania zadania (bez użycia pliku)?

14

Załóżmy, że istnieją 2 zadania t1, t2które można wykonać szeregowo, jak poniżej:

t1 ; t2
# OR
t1 && t2

Załóżmy teraz, że zapomniałem uruchomić t2i t1już działa; czy mogę dodać t2do potoku, aby został on wykonany po t1zakończeniu?

Abhimanyu Gupta
źródło

Odpowiedzi:

19

Tak, możesz:

  1. Wstrzymaj aktualnie uruchomione zadanie ze znakiem zawieszenia , naciskając Ctrl+ Z.
  2. Wpisz fglub %dodaj to, co chcesz na liście i uruchom, np .:
    fg ; systemctl suspend # or
    % ; systemctl suspend
    Ponieważ fgzwraca wartość zwrotu zadania, które zostało wznowione, operatorzy list lubią &&i ||działają zgodnie z oczekiwaniami:
    fg && echo "Finished successfully!" # or
    % && echo "Finished successfully!"

man bash/ JOB CONTROL mówi o zawieszonej postaci:

Wpisanie zawieszenia znak (zazwyczaj ^Z, Control- Z), gdy proces jest uruchomiony powoduje, że proces się zatrzymał i powraca do kontrolowania bash. (…) Użytkownik może następnie manipulować stanem tego zadania, używając bgpolecenia, aby kontynuować je w tle, fg polecenia, aby kontynuować na pierwszym planie lub killpolecenia, aby je zabić. A ^Zwchodzi w życie natychmiast i ma dodatkowy efekt uboczny, powodując odrzucenie oczekujących danych wyjściowych i typów.

fgwyjaśniono w man bash/ SHELL BUILTIN COMMANDS :

fg [ jobspec ]
Wznów specyfikację zadania na pierwszym planie i ustaw ją jako bieżącą. Jeśli specyfikacja zadania nie jest obecna, używane jest pojęcie powłoki o bieżącym zadaniu. Wartością zwracaną jest to, że polecenia umieszczonego na pierwszym planie, lub niepowodzenia jeśli bieg gdy kontrola zadaniem jest wyłączona lub, gdy prowadzony z kontrolą pracy włączona, jeśli jobspec nie określa prawidłową pracę lub jobspec określa zadania, które rozpoczęto bez kontroli zadań .

Dalsza lektura (oprócz man bash) na temat kontroli zadań:

deser
źródło
+1, ale szkoda, że ​​to nie działa, gdy zapomnisz t3w t1; t2; t3lub t1 && t2 && t3.
JoL
@JoL To prawda - ^Z^Zi %-;%+;t3w niektórych przypadkach jest wystarczająco dobry, ale nie jest to prawdziwe rozwiązanie problemu.
deser
2

Widziałem tę metodę tutaj: /superuser/334272/how-to-run-a-command-after-an-already-running-existing-one-finishes

gdzie najpierw robisz Ctrl+, zaby zatrzymać (zawiesić) działające, a następnie uruchamiasz nieodebrane polecenie w ten sposób: fg && ./missed_cmd.shi uruchomi się, jak tylko fgskończy się.

fg(Komenda na pierwszym planie) przyniesie zawieszonej pracy online i &&zapewni, że brakowało polecenie jest uruchamiane tylko wtedy, gdy pierwsze polecenie powiedzie.

George Udosen
źródło