2011-02-09 08:49:24 +0000 2011-02-09 08:49:24 +0000
183
183
Advertisement

Wat te doen als Ctrl + C een proces niet kan doden?

Advertisement

Ctrl + C werkt niet altijd om het huidige proces te doden (bijvoorbeeld als dat proces bezig is in bepaalde netwerkoperaties). In dat geval zie je gewoon “^C” bij je cursor en kun je niet veel anders doen.

Wat is de gemakkelijkste manier om dat proces nu te laten sterven zonder mijn terminal te verliezen?

Samenvatting van de antwoorden: Gewoonlijk kun je Ctrl + Z het proces laten inslapen, en dan kill -9 _process-pid_ doen, waar je de pid van het proces vindt met ps en andere hulpmiddelen. Op Bash (en mogelijk andere shells) kunt u kill -9 %1 doen (of ‘%N’ in het algemeen), wat gemakkelijker is. Als Ctrl + Z niet werkt, moet u een andere terminal openen en vandaaruit kill.

Advertisement
Advertisement

Antwoorden (9)

127
127
127
2011-02-09 09:13:54 +0000

Om het probleem te begrijpen waarom Ctrl + C niet werkt, is het zeer nuttig om te begrijpen wat er gebeurt als u erop drukt:

De meeste shells binden Ctrl + C om “een SIGINT signaal te sturen naar het programma dat op dat moment op de voorgrond draait”. U kunt over de verschillende signalen lezen via man signaal :

SIGINT 2 Term Interrupt from keyboard

Programma’s kunnen dat signaal negeren, omdat ze SIGTSTP ook kunnen negeren:

SIGTSTP 18,20,24 Stop Stop typed at tty

(Wat de meeste shells doen als u op Ctrl + Z drukt, daarom is het niet gegarandeerd dat het werkt)

Er zijn enkele signalen die niet kunnen worden genegeerd door het proces: SIGKILL , SIGSTOP en enkele andere. U kunt deze signalen verzenden via de opdracht SIGKILL . Dus, om uw ophangproces / zombieproces te doden, hoeft u alleen maar de proces-ID (PID) te vinden. Gebruik bijvoorbeeld pgrep of ps en dan kill het:

% kill -9 PID
119
119
119
2011-02-09 09:36:15 +0000

Als Ctrl+C (SIGINT) niet werkt, probeer dan Ctrl+E (SIGQUIT). Probeer dan Ctrl+Z (SIGTSTP). Als dat je terugbrengt naar een shell prompt, doe dan kill op het proces ID. (Dit is de standaardinstelling voor het SIGTERM signaal, dat je kunt specificeren met kill -TERM. In sommige shells kun je %1 gebruiken om naar de PID te verwijzen). Als dat niet werkt, ga dan naar een andere terminal of SSH-sessie en doe kill of kill -TERM op het proces-ID. Alleen als laatste redmiddel moet u kill -KILL doen, a.k.a. kill -9, omdat het proces geen kans krijgt om schoon af te breken, de openstaande bestanden te synchroniseren, de tijdelijke bestanden te verwijderen, de netwerkverbindingen te sluiten, enz.

37
Advertisement
37
37
2012-06-19 03:03:03 +0000
Advertisement

Zie ook deze link .

Ctrl+Z: pauzeer een proces.

Ctrl+C: vraag beleefd het proces nu af te sluiten.

Ctrl+: doodt genadeloos het proces dat nu op de voorgrond staat.

33
33
33
2011-02-09 08:53:17 +0000

Druk op Ctrl-Z om het programma op te schorten en zet het op de achtergrond ](http://www.fnal.gov/docs/UNIX/unix_at_fermilab/htmldoc/rev1997/uatf-14.html#MARKER-9-160):

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Herstel naar de voorgrond met behulp van fg)

Dan kunt u kill of kill -9 het, gezien het proces-ID (u krijgt dat van ps a).

13
Advertisement
13
13
2011-02-09 08:53:41 +0000
Advertisement

Meestal kunt u nog steeds het proces stoppen (Ctrl + Z) en dan kill -9 gebruiken. Voor kill -9 hebt u eerst de proces PID nodig. Voor achtergrondklussen is kill -9 %1 de eenvoudigste manier om het te doen - als je niet zeker weet wat het aantal achtergrondklussen is dat je wilt doden, voer jobs uit.

Als alternatief kun je proces-ID vinden met

ps

dan kun je

kill -9 <Appropriate PID from ps output>
``` uitvoeren.
5
5
5
2011-02-09 22:40:53 +0000

Een eenvoudigere oplossing voor Bash (en andere schelpen?) is om te doen:

Ctrl-z followed by kill -9 %1

waarbij “%1” verwijst naar het jobnummer dat wordt gedood. Het zou ‘%2’ kunnen zijn (of iets anders) als je al andere banen slapend hebt. Je kunt zien welk opdrachtnummer het is als je op Ctrl-z drukt:

[1]+ Stopped <process name>

Noteer dat ‘kill’ de shell versie van kill is, niet /bin/kill.

4
Advertisement
4
4
2011-02-09 09:01:45 +0000
Advertisement

1) Als u op de console en in multi-user mode bent, kunt u op CTRL-ALT-Fn drukken en inloggen op een ander scherm, ps -ef | grep <myprocessname> of pidof <myprocessname> gebruiken en dan -9 het proces op ID-nummer doden.

2) Als u op afstand verbonden bent, doe dan hetzelfde via een andere terminalsessie.

U kunt het leven ook wat gemakkelijker maken door htop te installeren, wat een veelzijdigere versie van top is die u in staat stelt om selectief lopende processen te doden. De meeste distro’s hebben htop in een repo.

3) Als je gewoon vastzit in een opgehangen ssh-sessie (naar een ander systeem, bijvoorbeeld), probeer dan op tilde (~) te drukken, wat de escape-toets is, en druk dan op CTRL-Z om terug te gaan naar de host-sessie, dan kun je het vastzittende ssh-proces doden of wachten tot het time-out is, wat de meeste ssh doen na een periode van inactiviteit.

0
0
0
2017-04-18 10:41:06 +0000

Als je tmux of scherm gebruikt, en geen van de bovenstaande werkt, dan zou je nog steeds de ruit kunnen doden door <prefix> x, dan wordt het proces ook gedood.

0
Advertisement
0
0
2017-10-26 13:16:30 +0000
Advertisement

Er is misschien een val set met SIGINT(2) in uw /etc/profiel. Zo ja, verwijder deze dan. Log uit en log terug in en je zou goed moeten zijn.

Advertisement

Gerelateerde vragen

6
10
11
5
9
Advertisement
Advertisement