Napisałem skrypt bash, który wywołuje kilka innych programów i wykonuje wiele poleceń. Uruchamiam ten skrypt z terminala. Teraz chcę zabić skrypt.
Wydaje Ctrl + C
mi się, że naciśnięcie czasami tego nie wycina, ponieważ czasami skrypt wykonuje inny program iz jakiegoś powodu sygnał zabicia nie działa.
Jeśli jednak zamknę okno terminalu, skrypt zostanie zabity.
Czy jest coś, co mogę zrobić (kombinacja klawiatury), analogicznie do zamykania okna terminala, bez faktycznego zamykania okna terminala (nie chcę stracić historii poleceń, bieżącego katalogu, historii danych wyjściowych itp.)?
Ctrl + z
Ctrl + z
biegu:kill -9 $(pgrep -f your_script.sh)
Odpowiedzi:
Masz kilka opcji. Jednym z nich jest zatrzymanie skryptu ( CtrlZ), uzyskanie PID skryptu i wysłanie
SIGKILL
do 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
kill
poleceniu lider procesu jest oznaczony w następujący sposób:Gdzie
PID
jest identyfikator procesu skryptu.Przykład:
Rozważ skrypt,
test.sh
który uruchamia niektóre procesy. Powiedzmy, że uruchomiłeś go w powłoce:W innym terminalu
W takim przypadku, aby wysłać sygnał do grupy procesów utworzonej przez
test.sh
, wykonaj następujące czynności:-INT
służy do wysyłaniaSIGINT
, więc to polecenie jest równoważne naciśnięciu CtrlCna terminalu. Aby wysłaćSIGKILL
:Musisz tylko zatrzymać skrypt, jeśli nie możesz otworzyć innego terminalu. Jeśli możesz, użyj,
pgrep
aby znaleźć PID.Jednym z poleceń uruchamianych przez skrypt może być zalewkowanie
SIGINT
, co prawdopodobnie CtrlCjest nieskuteczne. NieSIGKILL
można go jednak uwięzić i zwykle jest to opcja ostateczna . Możesz spróbowaćSIGTERM
(-TERM
) przed zabiciem. AniSIGKILL
czySIGTERM
można ustawić jako skrót klawiaturowy drogaSIGINT
jest.Wszystko to jest dyskusyjne, jeśli twój skrypt nie zawiera linii shebang. Z tej SO odpowiedzi :
Z tego powodu, gdy skrypt jest wykonywany, nie znajdziesz procesu o nazwie skryptu (lub procesu z nazwą skryptu w wierszu poleceń) i
pgrep
zakończy się niepowodzeniem.Zawsze używaj linii shebang.
źródło
SIGKILL
lubSIGTERM
?pgrep test.sh
nie zwraca mi PID. Próbowałem prostego testu.sh:for i in {1..30}; do sleep 1 echo $i done
Podczastest.sh
działania wykonujępgrep test.sh
w innym terminalu, ale nic nie jest zwracane. Co jest nie tak?pgrep -f test.sh
.pgrep -f test.sh
też nie działa../test.sh
Jeśli znasz procesy związane ze skryptem, możesz znaleźć ich PID za pomocą
a następnie użyj numeru PID, aby zabić odpowiednie procesy za pomocą
źródło
Jak powiedział Harris, możesz uruchomić,
Kill -9 PID_Number
ale możesz także zainstalować pakiet znany jakohtop
posiadający interaktywną przeglądarkę procesów, która znacznie ułatwia znajdowanie określonych procesów. htop obsługuje również procesy zabijania.źródło