Vraag "Kill " niet echt het proces te doden, waarom?


Ik probeer mijn commandoregelvaardigheden te verbeteren en ik ben een probleem tegengekomen waarbij ik een proces niet kan doden. ik typ kill 2200 waar 2200 mijn PID is en het proces niet wordt gedood. Na een paar minuten wachten is nog steeds in de top en ps aux. Ik heb zelfs geprobeerd het te typen met sudo - geen resultaten.

Om het even welke ideeën waarom het als dat zou zijn?


BEWERK

Ik heb een rare afhankelijkheid gevonden, waar fg werkt de processen lijst bij:

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps

100
2017-09-03 07:47


oorsprong


Welk proces was dat? Heb je gecontroleerd of het proces misschien was overledene? In dat geval zou je het ouderproces moeten doden. - htorque
Het proces is top (zoals vermeld in de bewerking). Ik wilde gewoon proberen het programma in de achtergrond te laten werken en het vervolgens terug te brengen. - Patryk
Als je een proces opschort met CTRL-z, blokkeert het de meeste signalen zolang het is opgeschort (dus totdat je een a fg of bg voor het proces) - nos


antwoorden:


Processen kunnen sommige signalen negeren. Als je SIGKILL verzendt, kan het dit niet negeren (en ook niet om het op te ruimen). Proberen:

kill -9 {PID}

Meer informatie door de handleidingpagina te lezen:

man kill

149
2017-09-03 08:09



merk ook op dat in sommige zeer specifieke omstandigheden, een proces kan in een zombie / niet-werkende staat zijn dat zelfs SIGKILL het proces niet kan doden. In dat geval zul je het parent-proces moeten vinden en het bovenliggende proces moeten beëindigen. - Lie Ryan
Als dat proces uit de pas loopt, dan is het dat wel KILL DASH NINE! - scottl
En soms is er geen ouderproces, in welk geval je gewoon bent genaaid. De enige manier om een ​​dergelijk proces te verwijderen, is door de machine opnieuw op te starten. - user606723
Je kunt ook gewoon gebruiken pkill process, waarbij proces de naam van het proces is in plaats van de proces-ID. - RobinJ
De naam van de opdracht kill blijft voor veel, veel gebruikers (inclusief ik aan het begin) misleidend. Men veronderstelt dat wanneer je "kill X" zegt, dit betekent dat je de X echt moet doden en niet iets anders moet doen. Ik begrijp dat dit niets zal veranderen, maar ik zou willen dat ze een meer elaboratieve naam hadden gekozen ... - rbaleksandar


Als kill wordt opgeroepen zonder enige parameter, het zendt het signaal nummer 15 (SIGTERM). Dit signaal kan door het proces worden genegeerd. Dit signaal meldt het proces om zijn spullen op te ruimen en vervolgens correct zelf te beëindigen. Dat is de leuke manier.

Je kunt ook "signaal" 9 "zenden" (SIGKILL) die niet door het proces kan worden genegeerd. Het proces zal het zelfs niet herkennen, omdat de kernel het proces beëindigt, niet het proces zelf. Dat is de slechte manier.

Een zegt kill -9 <pid> werkt altijd. Dat is een meisvatting. Er zijn situaties waarin zelfs kill -9 doodt het proces niet. Bijvoorbeeld wanneer een proces de status heeft D (ononderbroken slaap). Een proces komt in deze toestand elke keer dat het wacht op I / O (normaal niet erg lang). Dus als een proces wacht op I / O (bijvoorbeeld op een defecte harde schijf) en het niet correct is geprogrammeerd (met een time-out), dan moet je gewoon kan het proces niet doden. Wat je ook doet. U kunt gewoon proberen het bestand toegankelijk te maken voor het proces.


31
2018-06-10 06:22



Dit is erg nuttig, ik heb dit meerdere keren ervaren vanwege het ophangen van I / O-toegang op netwerkschijven en ik vroeg me af waarom ik processen die vastliepen niet kon doden. Bestaat er meer documentatie over dit specifieke probleem en hoe omzeil het? - Sheljohn


Ondanks de naam kill doodt het proces niet daadwerkelijk, het stuurt signalen naar het. Van de manpagina:

kill - send a signal to a process

Het standaardsignaal verzonden door kill [pid] is SIGTERM die gewoonlijk, maar niet noodzakelijk, het proces vraagt ​​om te beëindigen. Het is heel goed mogelijk om een ​​programma te schrijven dat een vrolijk deuntje speelt wanneer je de SIGTERM een signaal afgeven, maar niet aanbevolen.

Een ander gemeenschappelijk signaal is SIGHUP wat vaak wordt gebruikt om een ​​programma te vragen zijn configuratiebestanden opnieuw te lezen.

Als je echt een programma wilt doden, moet je de SIGKILL signaal door te doen kill -9 [pid].


7
2017-09-06 11:51





Het klinkt alsof u een proces opschort (misschien door op Ctrl-Z in de terminal te drukken). In deze status reageert uw proces niet op een SIGTERM als het is bevroren. Door 'fg' uit te voeren, wordt het proces ontdooid, zodat het het signaal kan oppikken en zichzelf kan beëindigen. Dat zou kunnen verklaren waarom 'fg' de proceslijst lijkt bij te werken.


2
2017-09-06 15:00



Dus hoe kan ik een aangesloten terminal vinden? - ruX


Vanuit C ++, heb ik het volgende uitgevoerd:

kill(4024, SIGKILL);

En op een linux (Ubuntu) -terminal,

$ ps -ax | grep my_su

De output was:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

Het lijkt er op dat het (4024) nog steeds overleeft. Nochtans, zodra ik het ouderproces beëindigde dat de bovengenoemde "doden" verklaring riep, 4024 verscheen niet meer. Nu oordeel ik dat het "ter ziele gegane" proces niets meer is dan een regel die wordt weergegeven en besloten om het te negeren. Ik hoop dat mijn ervaring iemand daar kan helpen. Proost!


0
2018-03-10 23:51