Einen angehaltenen Prozess beenden?


17

Ich war leicht verwirrt von:

% vim tmp
zsh: suspended   vim tmp
% kill %1
% jobs
[1]  + suspended   vim tmp
% kill -SIGINT %1
% jobs
[1]  + suspended   vim tmp
% kill -INT %1
% jobs
[1]  + suspended   vim tmp

Also habe ich mich damit abgefunden, es einfach selbst zu tun und mich gefragt, warum es später so ist:

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%

Oh!

Es macht wirklich Sinn, jetzt, wo ich darüber nachdenke, dass ausgeführt werden vimmuss, damit der Signal-Handler angewiesen wird, zu beenden und dies zu tun.

Aber offensichtlich nicht das, was ich vorhatte.

Gibt es eine Möglichkeit, mit einem einzigen Befehl "aufzuwachen und zu beenden"? dh ein eingebauter Alias ​​für kill %N && fg %N?

Warum funktioniert das Fortsetzen im Hintergrund nicht? Wenn ich bgstattdessen fg, bleibt Vim am Leben, bis ich fg, was meine obige Intuition bricht.

Antworten:


20

vi-vi-viist vom Teufel. Du musst es mit Feuer töten. Oder SIGKILL:

kill -KILL %1

Die eingebauten Funktionen killsind so freundlich, dass sie SIGCONTan angehaltene Prozesse gesendet werden können, sodass Sie dies nicht selbst tun müssen. Dies hilft jedoch nicht, wenn der Prozess das von Ihnen gesendete Signal blockiert oder die Verarbeitung des Signals dazu führt, dass die Prozesse angehalten werden erneut (wenn ein Hintergrundprozess versucht, vom Terminal zu lesen, wird er standardmäßig gesendet SIGTTIN, wodurch der Prozess angehalten wird, wenn er nicht verarbeitet wird).


1
Warum um alles in der Welt würden Sie SIGABRT verwenden? Es soll auf einen Programmfehler hinweisen. SIGKILL ist hier richtig, da Sie das Programm jetzt beenden möchten, egal ob Sie es möchten oder nicht.
Gilles 'SO - hör auf böse zu sein'

1
Tatsächlich sieht es so aus, als würde der SIGTERMSchlafprozess jetzt aktiviert, zumindest wenn sie keine Handler dafür haben. Ich denke, es hat früher nicht so funktioniert, da ich mich daran erinnere, dass es das Signal empfangen und weggehen musste bgoder fgso. Aber ich habe mit awk 'BEGIN{while(42){}}' &und getestet strace kill $!, und es gibt nur einen kill(2)Systemaufruf mit SIGTERM.
Peter Cordes

6

viminstalliert Signal-Handler (und wahrscheinlich auch Einstellungen sigprocmask(2)), um allgemeine Signale zu ignorieren, damit alle Dateien, die bearbeitet werden, nicht aufgrund einer Streukontrolle + c oder eines zufälligen Kill-Signals verloren gehen. Ein einfacheres Programm wird leicht getötet:

% cat busyloop.c
int main(void) {
for (;;) { ; }
return 0;
}
% make busyloop
cc     busyloop.c  -o busyloop
% ./busyloop
^Z
zsh: suspended  ./busyloop
% kill %1
%
[1]  + terminated  ./busyloop

Das vim(sichere) Herstellen eines Exits würde einen Signal-Handler erfordern , der Puffer usw. vimakzeptiert TERModer USR1speichert (oder verwirft?). Was möchten Sie tun, um einen solchen vimExit durchzuführen?


"Was versuchst du zu tun, um vim dazu zu bringen, so auszusteigen?" - nichts, es war eine echte "tmp" -Datei, die ich gerade bearbeitete. vimwar nur eine schlecht durchdachte Wahl des Programms zum Testen der Federung.
OJFord

1
„ignorieren gemeinsame Signale so , dass alle Dateien bearbeitet werden aufgrund einer Streu Kontrolle nicht verloren + c oder zufälligen Kill - Signal“ - aber sobald ich fg‚d ti habe verlassen, es nur gestoppt, solange sie suspendiert?
OJFord

2
@OllieFord: Weckt nur SIGKILLeinen Schlafprozess auf, damit er sterben kann. Das Senden von Signalen an einen angehaltenen Prozess mit benutzerdefinierten Handlern führt nicht zum Aufwecken. (Abgesehen von SIGCONTdem Fortsetzsignal natürlich. bgUnd fgsenden SIGCONT.)
Peter Cordes
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.