Strg + C beendet den Prozess nicht

8

Ich habe nach Antworten gesucht und bisher nichts gefunden, um meine Frage zu beantworten. Ich melde mich derzeit bei meinem Ubuntu-Server an und kann beim Ausführen eines Prozesses keinen der Interrupts darauf ausführen. Hier ist mein stty -a:

user@Ubuntu1:~$ stty -a
speed 38400 baud; rows 93; columns 200; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;

Ich habe nichts in meiner .bashrc, was die Interrupts ändert.

Dies ist für alle Benutzer einschließlich root gleich. Ich habe auch versucht, mich von verschiedenen Standorten aus mit verschiedenen Terminals anzumelden, und jedes Mal wird das gleiche Ergebnis angezeigt. Ich habe sowohl ssh als auch ssh -X verwendet, um mich anzumelden.

Bearbeiten: Vor Ort funktionieren alle meine Interrupts einwandfrei.

Update: Ich suche noch eine Antwort. Mein Freund hat genau das gleiche Problem. Das Problem scheint sehr zu sein, dass die Tastatur beim Anmelden (von PC, Mac, Linux) diese Tasten nicht aufnimmt (obwohl sie korrekt zugeordnet sind).

user700786
quelle
Was ist die Ausgabe von Ctrl+Vund schlagen Ctrl+C? Haben Sie versucht, den Prozess mit zu kill -s 2 <pid_of_process>beenden? Dies sollte dem Senden des SIGINT-Signals an den Prozess entsprechen. Überprüfen Sie die Einstellungen Ihres Terminalemulatorschlüssels.
Die Ausgabe ist korrekt. Wenn ich die folgenden Strg + V und dann Strg + CI mache, bekomme ich ^ C. Ich bekomme das gleiche, wenn ich Strg + V mache und dann Strg + ZI ^ Z. Ich kann Prozesse mit kill beenden, wenn ich dies von einem anderen Terminal aus mache. Beachten Sie auch, dass diese Befehle lokal und in anderen Terminals
einwandfrei
3
Haben Sie versucht, Ctrl+Cwährend eines anderen Prozesses zu schlagen (z. B. cat)? Vielleicht ist es dieser Prozess, der ignoriert Ctrl+C. Oder meinst du damit, dass dieser bestimmte Prozess lokal auf dem Ubuntu-Server reagiert Ctrl+C. In welchem ​​Fall haben Sie es in welchem ​​Terminal versucht? Was ist mit einer screenSitzung?
Gilles 'SO - hör auf böse zu sein'
Wenn ich irgendetwas im Terminal meines Computers laufen lasse, werden die Interrupts problemlos erkannt. Es ist, sobald ich in meinen Server ssh, dass es die Interrupts nicht aufnimmt. Keiner der Prozesse, die ich versucht habe, Interrupts aufzunehmen
user700786
Wenn der Befehl mit getötet wird kill -s 2( man beachte das -s 2, dass der SIGINT(das Signal , das in der Regel gesendet wird, wenn Sie Strg + C treffen, die Standardeinstellung für killist SIGTERM)), dann wird der Befehl nicht den Interrupt ignoriert. Etwas anderes nimmt es auf. Wenn Sie dies lokal ausführen und es funktioniert, sagen Sie, dass es mit demselben Terminal auf dem Clientcomputer funktioniert, um etwas lokal auszuführen, oder wenn Sie einen Terminalemulator lokal auf dem Servercomputer ausführen? Ich frage mich, ob Sie einen Emulator verwenden, der versucht, Strg + C aus der Windows-Welt
nachzuahmen

Antworten:

5

ctrl+ ctötet niemals ein Programm,

Das ist einfach nicht das, was es tut.

Es gibt eine Reihe von Signalen, die der POSIX-Standard definiert. Diese dienen zur Steuerung eines laufenden Programms.

  First the signals described in the original POSIX.1-1990 standard.
  Signal     Value     Action   Comment
  ──────────────────────────────────────────────────────────────────────
  SIGHUP        1       Term    Hangup detected on controlling terminal
                                or death of controlling process
  SIGINT        2       Term    Interrupt from keyboard
  SIGQUIT       3       Core    Quit from keyboard
  SIGILL        4       Core    Illegal Instruction
  SIGABRT       6       Core    Abort signal from abort(3)
  SIGFPE        8       Core    Floating point exception
  SIGKILL       9       Term    Kill signal
  SIGSEGV      11       Core    Invalid memory reference
  SIGPIPE      13       Term    Broken pipe: write to pipe with no
  SIGTERM      15       Term    Termination signal

- http://man7.org/linux/man-pages/man7/signal.7.html

ctrl+ csendet das Signal 2"Interrupt von Tastatur" an das Programm, das Sie von einem Terminal aus ausgeführt haben.

Es liegt ganz beim Programm, dieses Signal zu verarbeiten. Es kann tun, was es will. Viele Skriptsprachendolmetscher können dies standardmäßig behandeln, indem sie das aufgerufene Skript beenden und ordnungsgemäß beenden.

Wenn Sie möchten, dass ein Programm beendet wird, insbesondere aus einem automatischen Kontext, wird Singal 15 empfohlen. Das killProgramm kann verwendet werden, um Signale per ID (pid) an einen Prozess zu senden.

kill -15 <pid>

Soweit mir bekannt ist, empfängt das Programm dieses Signal immer noch selbst und sollte so schnell wie möglich so sauber wie möglich beendet werden.

Wenn das Programm jedoch Signal 15 ignoriert und das Programm weiterhin aktiv ist (und Sie das Signal aufgrund eines Berechtigungsfehlers nicht senden können)

kill -9 <pid>

Signal 9 wird, soweit mir bekannt ist, vom Kernel (dem Task-Manager und der Hardwareschnittstelle) interpretiert. Der Kernel stoppt abrupt die Verarbeitung des Programms und gibt die Zuweisung / Freigabe aller seiner Ressourcen auf.

ThorSummoner
quelle
3

Hier ist ein Hardcore-Trick:

Control-Z

Dadurch wird Ihr Prozess angehalten und Sie erhalten die Job-ID dieses Prozesses

Dann:

kill -9 %1

(Ersetzen Sie 1 durch Ihre Job-ID).

Hinweis: Der Prozentsatz ist obligatorisch! Andernfalls wird Ihr Init-Prozess beendet, was bedeutet, dass Sie den Kernel beenden und das gesamte System abstürzt (setzen Sie also kein Leerzeichen dazwischen :)

Kenorb
quelle
0

Strg + C beendet den Vorgang nicht. Es stoppt nur den aktuell laufenden Prozess in der Mitte. Um den Prozess abzubrechen, müssen wir den Befehl "KILL" verwenden

Rajeev Tarun Mavuri
quelle
7
Tatsächlich killsendet ein Signal an einen Prozess. Tötet es nicht. Das mit gesendete Standardsignal killist TERM, das mit gesendete Signal ctrl+cist SIGINT.
Fmanco
0

Ich bin auf diesen alten Forumsbeitrag zu diesem speziellen Thema gestoßen. Es scheint, dass die Standard-Interrupt-Sequenz irgendwo in einer separaten Konfigurationsdatei überschrieben werden könnte.

Wenn Sie diesen Prozess nur extern beenden möchten, können Sie kill verwenden. Achten Sie jedoch darauf, dass Sie kill töten, wie in diesem Artikel zum Beenden von Prozessen beschrieben , anstatt einfach zum extremsten Kill -9 zu springen.

Wikipedia ist eine großartige Ressource für das Kill-Programm . Auch hier ist eine Liste der Unix-Signale und was sie tun.

jjclarkson
quelle