Uruchomiłem swój program na pierwszym planie (program demona), a następnie zabiłem go kill -9
, ale pozostało mi zombie i nie mogę go zabić kill -9
. Jak zabić proces zombie?
Jeśli zombie jest martwym procesem (już zabitym), jak usunąć go z wyjścia ps aux
?
root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
1163 root 2552 S anyprogramd
1167 root 2552 S anyprogramd
1169 root 2552 S anyprogramd
1170 root 2552 S anyprogramd
10101 root 944 S grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
1163 root 0 Z [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
1163 root 0 Z [anyprogramd]
ps -o ppid 1163
mówi? To znaczy, kto jest rodzicem 1163? To jest proces, który należy zakończyć.Odpowiedzi:
Zombie już nie żyje, więc nie możesz go zabić. Aby oczyścić zombie, musi czekać na niego jego rodzic, więc zabicie rodzica powinno działać na rzecz wyeliminowania zombie. (Po śmierci rodzica zombie zostanie odziedziczony przez pid 1, który zaczeka na niego i wyczyści swój wpis w tabeli procesów.) Jeśli twój demon tworzy dzieci, które stają się zombie, masz błąd. Twój demon powinien zauważyć, kiedy jego dzieci umierają i
wait
na nich określić ich status wyjścia.Przykład tego, jak możesz wysłać sygnał do każdego procesu, który jest rodzicem zombie (pamiętaj, że jest to wyjątkowo prymitywne i może zabić procesy, których nie zamierzasz. Nie polecam używania tego rodzaju młota kowalskiego):
# Don't do this. Incredibly risky sledge hammer! kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
źródło
ps aux
?kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}' | sort -u)
PPid
rzędzie, jeślicat /proc/<pid>/status
Możesz wyczyścić proces zombie, zabijając jego proces nadrzędny za pomocą następującego polecenia:
kill -HUP $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
źródło
grep
jest to konieczne.ps ... | awk '/[zZ]/{print $2}'
Próbowałem:
ps aux | grep -w Z # returns the zombies pid ps o ppid {returned pid from previous command} # returns the parent kill -1 {the parent id from previous command}
to zadziała :)
źródło
Znalazłem go pod adresem http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/
2) Oto świetna wskazówka od innego użytkownika (Thxs Bill Dandreta): Czasami
kill -9 <pid>
nie zabije procesu. Biegać
czwarte pole to proces rodzicielski, zabij wszystkich rodziców zombie, a zombie zginie!
Przykład
4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat 4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr 4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie
18581
,18582
,18583
Są zombie -kill -9 18581 18582 18583
nie ma żadnego efektu.
kill -9 31706
usuwa zombie.
źródło
init
dla mnie, a teraz nie mogę nic zrobić i jestem zmuszony do ponownego uruchomienia ... proces zombie to Java, zabierający 3,4 GB z 4 GB pamięci RAMpróbowałem
kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
i to działa dla mnie.
źródło
Czasami rodzic ppid nie może zostać zabity, stąd zabij pid zombie
kill -9 $(ps -A -ostat,pid | awk '/[zZ]/{ print $2 }')
źródło