Ctrl + c non interromperà il processo


8

Ho cercato risposte e finora non ho trovato nulla per rispondere alla mia domanda. Attualmente sto accedendo al mio server Ubuntu e durante l'esecuzione di un processo non posso eseguire nessuno degli interrupt su di esso. Ecco il mio 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;

Non ho nulla nel mio .bashrc che cambia gli interrupt.

Questo è lo stesso per tutti gli utenti incluso root. Ho anche provato ad accedere da posizioni diverse usando terminali diversi e ogni volta che appare lo stesso risultato. Ho usato sia ssh che ssh -X per accedere.

Modifica: localmente tutti i miei interrupt funzionano bene.

Aggiornamento: sto ancora cercando una risposta. Il mio amico ha esattamente lo stesso problema. Il problema sembra essere che quando si accede (da PC, Mac, Linux) la tastiera non rileva questi tasti (anche se mappati correttamente).


Qual è l'output di Ctrl+Ve colpire Ctrl+C? Hai provato ad uccidere il processo con kill -s 2 <pid_of_process>? Questo dovrebbe essere uguale all'invio del segnale SIGINT al processo. Controlla le impostazioni della chiave dell'emulatore di terminale.

L'output è corretto. Se faccio i seguenti Ctrl + V e poi Ctrl + CI ottengo ^ C. Ottengo lo stesso se faccio Ctrl + V e poi Ctrl + ZIo ottengo ^ Z. Posso uccidere i processi con kill se lo faccio da un altro terminale. Inoltre, nota localmente e in altri terminali questi comandi funzionano bene
user700786

3
Hai provato a colpire Ctrl+Cmentre esegui un altro processo (ad esempio cat)? Forse è quel processo che ignora Ctrl+C. O vuoi dire che localmente sul server Ubuntu, quel particolare processo risponde Ctrl+C, nel qual caso, in quale terminale hai provato? Che ne dici di una screensessione?
Gilles 'SO- smetti di essere malvagio' il

Se eseguo qualcosa nel terminale sulla mia macchina, allora non rileverò alcun problema. È appena entrato nel mio server che non raccoglierà gli interrupt. Nessuno dei processi che ho provato ha
rilevato

Se il comando viene ucciso con kill -s 2(nota il -s 2, cioè SIGINT(il segnale che viene solitamente inviato quando premi Ctrl + C, il valore predefinito killè SIGTERM)), allora il comando non ignora l'interruzione. Qualcos'altro lo sta raccogliendo. Quando lo esegui localmente e funziona, stai dicendo che funziona usando lo stesso terminale nel computer client per eseguire qualcosa localmente o eseguendo un emulatore di terminale localmente nel computer server? Mi chiedo se stai usando un emulatore che sta cercando di imitare Ctrl + C dal mondo Windows ...
njsg

Risposte:


5

ctrl+ cnon uccide mai un programma,

Non è quello che fa.

Esistono una serie di segnali definiti dallo standard POSIX, che vengono utilizzati per controllare un programma in esecuzione.

  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+ cinvia il segnale 2"Interrompi da tastiera" al programma eseguito da un terminale.

Sta interamente al programma per gestire quel segnale, può fare quello che vuole al riguardo. Molti interpreti del linguaggio di scripting possono gestirlo in modo predefinito uccidendo lo script chiamato ed uscendo con grazia.

Se si desidera che un programma esca, in particolare da un contesto automatico, si consiglia singal 15, il killprogramma può essere utilizzato per inviare segnali a un processo tramite id (pid).

kill -15 <pid>

Per quanto ne so, il programma riceve ancora questo segnale stesso e dovrebbe terminare al più presto possibile.

Se il programma ignora il segnale 15 e il programma persiste (e non si riesce a inviare il segnale a causa di un errore di autorizzazione)

kill -9 <pid>

Il segnale 9, per quanto ne so, è interpretato dal kernel (il task manager e l'interfaccia hardware), il kernel interrompe bruscamente l'elaborazione del programma e disalloca / libera tutte le sue risorse.


3

Ecco qualche trucco hardcore:

Control-Z

sospenderà il processo e ti restituirà l'ID lavoro di tale processo

Poi:

kill -9 %1

(sostituisci 1 con il tuo ID lavoro).

Nota: la percentuale è obbligatoria !, altrimenti ucciderai il tuo processo di init, il che significa che ucciderai il kernel e l'intero sistema andrà in crash (quindi non mettere lo spazio tra :)


0

Ctrl + c non ucciderà il processo. interromperà semplicemente l'attuale processo in corso nel mezzo. Per terminare il processo dobbiamo usare il comando "KILL"


7
In effetti killinvia un segnale a un processo. Non lo uccide. Il segnale predefinito inviato con killè TERM, il segnale inviato con ctrl+cè SIGINT.
fmanco,

0

Mi sono imbattuto in questo vecchio post sul forum su questo particolare problema. Sembra che la sequenza di interruzione predefinita possa essere sovrascritta in un file di configurazione separato da qualche parte.

Se stai solo cercando di uccidere questo processo esternamente, puoi usare kill solo facendo attenzione che dovresti intensificare l'uccisione come indicato in questo articolo sui processi di uccisione , piuttosto che saltare all'uccisione più estrema -9.

Wikipedia è una grande risorsa per il programma kill . Anche qui c'è un elenco di segnali Unix e cosa fanno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.