2011-11-04 26 views
27

I wykonywane następujące polecenieJak zabić proces nohup?

$ nohup ./tests.run.pl 0 & 

teraz gdy próbuję go zabić (i egzekucje, które są uruchamiane z tego skryptu) używając

$ kill -0 <process_id> 

to nie działa. Jak mogę zabić proces nohupped i procesy uruchamiane przez skrypt nohupped?

Dzięki

Odpowiedz

37

kill -0 robi nie zabić proces. Sprawdza tylko, czy możesz wysłać do niego sygnał.

Po prostu kill pid, a jeśli to nie zadziała, spróbuj kill -9 pid.

+0

to działało bardzo dziękuję. – polerto

+1

@Mat, Czy muszę najpierw uzyskać identyfikator procesu? Co się stanie, jeśli uruchomię wiele procesów i chcę zabić je wszystkie naraz? Wykonałem obliczenia równoległe z wykorzystaniem wielu rdzeni, więc istnieje 10 procesów wywoływanych przez "nohup". Chcę ich wszystkich zabić. Czy mógłbyś mnie tutaj polecić? Dzięki. –

+0

Zabiłem proces nohup z kill -9, ale nadal, gdy uruchamiam polecenie tail f nohup.out otrzymuję logi ciągle ... to znaczy, że mój proces działa. Co zrobić? –

25

Po prostu kill <pid>, który wyśle ​​SIGTERM, którego nie będzie ignorować nohup.

Najpierw nie należy wysyłać numeru SIGKILL, ponieważ proces ten nie daje szansy na odzyskanie; należy spróbować, co następuje w kolejności:

  • SIGTERM (15)
  • SIGINT (2)
  • SIGKILL (9)
+2

Absolutnie prawdziwe. SIGKILL (kill -9) nie może zostać przechwycony przez procedury obsługi sygnałów procesu. Oznacza to, że nie można zapisać żadnego kodu epilogu w celu usunięcia plików tymczasowych i/lub oddzielić przydzielonych segmentów pamięci współużytkowanej. Brak czyszczenia pamięci współdzielonej oznacza, że ​​mniejsza ilość pamięci jest dostępna dla nowych procesów - nieprzyjemna rzecz. – JRFerguson

2

Jeśli nie znasz identyfikatory procesowych oraz IT może uruchamiać różne polecenia w powłoce (lub pętli), można uruchomić jobs -l, aby wyświetlić listę zadań i PID, a następnie kill.

Patrz przykład:

[email protected]:/usr/share/etlservice/bin$ jobs -l 
[1] 27398 Running     nohup ./extract_assessor_01.sh > job1.log & 
[2] 27474 Running     nohup ./extract_assessor_02.sh > job2.log & 
[3] 27478 Running     nohup ./extract_assessor_03.sh > job3.log & 
[4]- 27481 Running     nohup ./extract_assessor_04.sh > job4.log & 
[5]+ 28664 Running     nohup ./extract_assessor_01.sh > job1.log & 
[email protected]:/usr/share/etlservice/bin$ sudo kill 27398 
sudo kill 27474[1] Terminated    nohup ./extract_assessor_01.sh > job1.log 
[email protected]:/usr/share/etlservice/bin$ sudo kill 27474 
[2] Terminated    nohup ./extract_assessor_02.sh > job2.log 
[email protected]:/usr/share/etlservice/bin$ sudo kill 27478 
[3] Terminated    nohup ./extract_assessor_03.sh > job3.log 
[email protected]:/usr/share/etlservice/bin$ sudo kill 27481 
[4]- Terminated    nohup ./extract_assessor_04.sh > job4.log 
[email protected]:/usr/share/etlservice/bin$ sudo kill 28664 
[5]+ Terminated    nohup ./extract_assessor_01.sh > job1.log 
[email protected]:/usr/share/etlservice/bin$ 
3

chciałbym zrobić coś takiego:

jobs 

[1] + Running nohup ./tests.run.pl 

kill %1 
0

zabić nohup proces

ps aux |grep nohup 

grep że PID kill -15 -1 16000 (będziesz wylogowania) i oczyścić na następny login root