Załóżmy, że istnieją 2 zadania t1
, t2
które można wykonać szeregowo, jak poniżej:
t1 ; t2
# OR
t1 && t2
Załóżmy teraz, że zapomniałem uruchomić t2
i t1
już działa; czy mogę dodać t2
do potoku, aby został on wykonany po t1
zakończeniu?
Załóżmy, że istnieją 2 zadania t1
, t2
które można wykonać szeregowo, jak poniżej:
t1 ; t2
# OR
t1 && t2
Załóżmy teraz, że zapomniałem uruchomić t2
i t1
już działa; czy mogę dodać t2
do potoku, aby został on wykonany po t1
zakończeniu?
Odpowiedzi:
Tak, możesz:
fg
lub %
dodaj to, co chcesz na liście i uruchom, np .:
fg ; systemctl suspend # or
% ; systemctl suspend
Ponieważ fg
zwraca 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 kontrolowaniabash
. (…) Użytkownik może następnie manipulować stanem tego zadania, używającbg
polecenia, aby kontynuować je w tle,fg
polecenia, aby kontynuować na pierwszym planie lubkill
polecenia, aby je zabić. A^Z
wchodzi w życie natychmiast i ma dodatkowy efekt uboczny, powodując odrzucenie oczekujących danych wyjściowych i typów.
fg
wyjaś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ń:
^Z^Z
i %-;%+;t3
w niektórych przypadkach jest wystarczająco dobry, ale nie jest to prawdziwe rozwiązanie problemu.
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.sh
i uruchomi się, jak tylko fg
skoń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.
t3
wt1; t2; t3
lubt1 && t2 && t3
.