Proces zabijania kończy się niepowodzeniem

1

Używam skryptu bash jako zadania w tle. Skrypt bash wywołuje czasochłonny plik wykonywalny. Jeśli się nie mylę, uruchomienie skryptu bash jest procesem nadrzędnym, a uruchomienie pliku wykonywalnego jest procesem potomnym.

Chcę teraz zatrzymać cały proces, zabijając proces nadrzędny, który jest zadaniem w tle

kill -9 $(jobs -p)

Terminal pokazuje, że uruchomienie skryptu bash zostało zabite. Ale uruchomienie pliku wykonywalnego nadal zależy od wyjścia top. Zastanawiam się tylko, jak zabić proces potomny?

Tim
źródło

Odpowiedzi:

1

Użyj ujemnego PID, który spowoduje zabicie grupy procesów. --Mówi zabić, że reszta argumentów nie są przełączniki opcja tak myślnik (minus) przed PID nie będzie go mylić.

kill -- -12345

Ponadto -9jest ostatecznością. Nie używaj go, dopóki nie wypróbujesz przynajmniej -15(SIGTERM, który jest domyślny). Daje to programowi szansę na utrzymanie domu przed wyjściem. Zobacz Kiedy powinienem użyć kill -9 lub Bezużyteczne użycie kill -9 lub kill -9 .

Dennis Williamson
źródło
0

killall może dać lepsze wyniki.

Ostrzeżenie : killall zachowuje się inaczej na różnych * nixach. W systemie Linux zabije procesy z tytułami pasującymi do argumentu. W systemie Solaris zabije KAŻDY proces , nie tylko te, które określisz. Tak więc w Solarisie uruchomienie killall jako root skutecznie zamknie maszynę. Upewnij się, że wiesz, jakie zachowanie wykonuje polecenie

Deniz Zoeteman
źródło
4
Ostrzegam, killall zachowuje się inaczej na różnych * nixach. W systemie Linux zabije procesy z tytułami pasującymi do argumentu. W systemie Solaris zabije KAŻDY proces, nie tylko te, które określisz. Tak więc w Solarisie uruchomienie killall jako root skutecznie zamknie maszynę. Upewnij się, że wiesz, jakie zachowanie wykonuje polecenie.
Babu
Dzięki za ten komentarz, @Babu, to zdecydowanie coś przeoczyłem.
Deniz Zoeteman