Masz kilka opcji. Jednym z nich jest zatrzymanie skryptu ( CtrlZ), uzyskanie PID skryptu i wysłanie SIGKILLdo grupy procesów.
Gdy polecenie jest wykonywane w powłoce, rozpoczyna się proces, a wszystkie jego elementy potomne są częścią tej samej grupy procesów (w tym przypadku grupy procesów pierwszego planu). Aby wysłać sygnał do wszystkich procesów w tej grupie, należy wysłać go do lidera procesu. W killpoleceniu lider procesu jest oznaczony w następujący sposób:
kill -PID
Gdzie PIDjest identyfikator procesu skryptu.
Przykład:
Rozważ skrypt, test.shktóry uruchamia niektóre procesy. Powiedzmy, że uruchomiłeś go w powłoce:
$ ./test.sh
W innym terminalu
$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)───sshd(1211)───sshd(17312)───sshd(17372)───zsh(17788)───test.sh(17802)─┬─dd(17804)
├─sleep(17805)
└─yes(17803)
W takim przypadku, aby wysłać sygnał do grupy procesów utworzonej przez test.sh, wykonaj następujące czynności:
kill -INT -17802
-INTsłuży do wysyłania SIGINT, więc to polecenie jest równoważne naciśnięciu CtrlCna terminalu. Aby wysłać SIGKILL:
kill -KILL -17802
Musisz tylko zatrzymać skrypt, jeśli nie możesz otworzyć innego terminalu. Jeśli możesz, użyj, pgrepaby znaleźć PID.
Jednym z poleceń uruchamianych przez skrypt może być zalewkowanie SIGINT, co prawdopodobnie CtrlCjest nieskuteczne. Nie SIGKILLmożna go jednak uwięzić i zwykle jest to opcja ostateczna . Możesz spróbować SIGTERM( -TERM) przed zabiciem. Ani SIGKILLczy SIGTERMmożna ustawić jako skrót klawiaturowy droga SIGINTjest.
Wszystko to jest dyskusyjne, jeśli twój skrypt nie zawiera linii shebang. Z tej SO odpowiedzi :
Zwykle powłoka nadrzędna zgaduje, że skrypt jest napisany dla tej samej powłoki (minimalne powłoki podobne do Bourne'a uruchamiają skrypt za pomocą / bin / sh, bash uruchamia go jako podproces bash) ...
Z tego powodu, gdy skrypt jest wykonywany, nie znajdziesz procesu o nazwie skryptu (lub procesu z nazwą skryptu w wierszu poleceń) i pgrepzakończy się niepowodzeniem.
Zawsze używaj linii shebang.
Ctrl + z