Chcę uruchomić dwa polecenia jednocześnie w bash na komputerze z systemem Linux. Dlatego w ./execute.sh
skrypcie bash umieściłem:
command 1 & command 2
echo "done"
Jednak gdy chcę zatrzymać skrypt bash i nacisnąć Ctrl+ C, tylko drugie polecenie jest zatrzymane. Pierwsze polecenie jest kontynuowane. Jak upewnić się, że cały skrypt bash został zatrzymany? W każdym razie, jak zatrzymać oba polecenia? Ponieważ w tym przypadku bez względu na to, jak często naciskam Ctrl+, Cpolecenie działa nadal i jestem zmuszony zamknąć terminal.
Odpowiedzi:
Jeśli wpiszesz
to jest równe
tzn. uruchomi pierwsze polecenie w tle, a następnie uruchomi drugie polecenie na pierwszym planie. W szczególności oznacza to, że
echo "done"
drukarka jest drukowana pocommand 2
zakończeniu, nawet jeślicommand 1
nadal działa.Prawdopodobnie chcesz
Spowoduje to uruchomienie obu poleceń w tle i poczekanie na ich zakończenie.
Jeśli naciśniesz CTRL-C, wyśle to tylko sygnał SIGINT do procesu pierwszego planu, tj.
command 2
W twojej wersji lubwait
w mojej wersji.Sugerowałbym ustawienie takiej pułapki:
Za pomocą pułapki sygnał SIGINT wytwarzany przez CTRL-C jest przechwytywany i zastępowany przez
killgroup
funkcję, która zabija wszystkie te procesy.źródło
set -x
na początku skryptu, aby wydrukować wykonane polecenia.Podczas wstawiania polecenia w tle ze skryptu PID nie jest wyświetlany na ekranie. Możesz użyć wbudowanej zmiennej,
$!
która przechowuje PID ostatniego procesu, dzięki czemu możesz przechwycić PID polecenia1.powtórzy PID polecenia1.
Bash zapewnia także wbudowaną pułapkę, której można użyć do zarejestrowania sekwencji poleceń uruchamianych po odebraniu określonych sygnałów. Możesz użyć tego, aby złapać SIGINT i kill polecenie1 przed wyjściem ze skryptu głównego, np
Teraz, gdy polecenie 2 jest uruchomione, naciśnięcie Ctrl Cspowoduje wysłanie zarówno polecenia 1, jak i polecenia 2 SIGINT.
źródło
%n
składni, aby zabić określone zadania w tle w tej powłoce. Zwykle próbujeszkill %1
zabić najnowszy i jedyny proces w tle. W przypadku większej liczby procesów w tle użyjjobs
najpierw , aby wyświetlić listę.Nowsze wersje GNU Parallel zrobią to, co chcesz:
Lub jeśli
command
pozostaje taki sam:Obejrzyj film wprowadzający, aby zapoznać się z krótkim wprowadzeniem: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Przejdź przez samouczek (samouczek_ równoległy). Wiersz poleceń z miłością za to.
źródło
Ctrl+ Cwysyła sygnał SIGINT do procesu frontowego, który jest
command2
.command1
jest uruchamiany w tle, dlatego strumień wejściowy go nie dotyczy.Kiedy
command1 &
piszesz, bash powinien dać ci proces PID, coś w rodzaju[1234]
. Aby zabić ten proces, możesz użyćkill 1234
. Teraz, jeśli masz PID obucommand1
icommand2
(spójrz naps -ef
), możesz użyć,kill
aby zakończyć je wszystkie:Mała sztuczka polega na uruchomieniu obu poleceń w tle, z:
Bash da ci oba PID, gotowe do zabicia. Inną sztuczką byłoby przywrócenie
command1
na pierwszy plan po zabiciucommand2
:Więcej informacji dostępnych tutaj: http://linuxg.net/how-to-manage-background-and-foreground-processes/
źródło