Ctrl + c no matará el proceso


8

He buscado respuestas y hasta ahora no he encontrado nada para responder mi pregunta. Actualmente estoy iniciando sesión en mi servidor Ubuntu y al ejecutar un proceso no puedo ejecutar ninguna de las interrupciones en él. Aquí está mi 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;

No tengo nada en mi .bashrc que cambie las interrupciones.

Esto es lo mismo para todos los usuarios, incluido el root. También he intentado iniciar sesión desde diferentes ubicaciones utilizando diferentes terminales y cada vez que aparece este mismo resultado. He utilizado tanto ssh como ssh -X para iniciar sesión.

Editar: localmente todas mis interrupciones funcionan bien.

Actualización: todavía estoy buscando una respuesta. Mi amigo tiene exactamente el mismo problema. El problema parece ser que al iniciar sesión (desde PC, Mac, Linux) el teclado no recoge estas teclas (aunque esté correctamente asignado).


¿Cuál es la salida Ctrl+Vy el golpe Ctrl+C? ¿Has intentado matar el proceso con kill -s 2 <pid_of_process>? Esto debería ser igual a enviar la señal SIGINT al proceso. Verifique la configuración de las teclas del emulador de terminal.

La salida es correcta. Si hago lo siguiente Ctrl + V y luego Ctrl + CI obtengo ^ C. Obtengo lo mismo si hago Ctrl + V y luego Ctrl + ZI obtengo ^ Z. Puedo matar procesos con kill si hago esto desde otra terminal. También tenga en cuenta que localmente y en otros terminales estos comandos funcionan bien
user700786

3
¿Has intentado golpear Ctrl+Cmientras ejecutas otro proceso (por ejemplo cat)? Quizás es ese proceso el que ignora Ctrl+C. ¿O quiere decir que localmente en el servidor Ubuntu, ese proceso particular responde Ctrl+C, en cuyo caso, en qué terminal probó? ¿Qué tal una screensesión?
Gilles 'SO- deja de ser malvado'

Si ejecuto algo en el terminal de mi máquina, entonces detectará las interrupciones sin problema. Tan pronto como ingresé a mi servidor, no detectará las interrupciones. Ninguno de los procesos que he intentado
detecta

Si el comando se mata con kill -s 2(tenga en cuenta -s 2que, eso es SIGINT(la señal que generalmente se envía cuando presiona Ctrl + C, el valor predeterminado killes SIGTERM)), entonces el comando no ignora la interrupción. Algo más lo está recogiendo. Cuando ejecuta esto localmente y funciona, ¿está diciendo que funciona usando el mismo terminal en la máquina del cliente para ejecutar algo localmente, o ejecuta un emulador de terminal localmente en la máquina del servidor? Me pregunto si estás usando algún emulador que está tratando de imitar Ctrl + C del mundo de Windows ...
njsg

Respuestas:


5

ctrl+ cnunca mata un programa,

Eso no es lo que hace.

Hay un conjunto de señales que define el estándar POSIX, que se utilizan para controlar un programa en ejecución.

  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+ cenvía la señal 2, "Interrupción desde el teclado" al programa que ha ejecutado desde un terminal.

Es totalmente dependiente del programa manejar esa señal, puede hacer lo que quiera al respecto. Muchos intérpretes de lenguaje de script pueden manejar esto de manera predeterminada al eliminar el script llamado y salir con gracia.

Si desea que un programa salga, especialmente desde un contexto automático, se recomienda singal 15, el killprograma se puede usar para enviar señales a un proceso por id (pid).

kill -15 <pid>

Hasta donde yo sé, el programa aún recibe esta señal y debería terminar lo antes posible tan limpiamente como sea posible.

Sin embargo, si el programa ignora la señal 15, y el programa persiste para vivir (y no está fallando en enviar la señal debido a un error de permiso)

kill -9 <pid>

La señal 9, hasta donde yo sé, es interpretada por el kernel (el administrador de tareas y la interfaz de hardware), el kernel detiene abruptamente el procesamiento del programa y desasigna / libera todos sus recursos.


3

Aquí hay un truco hardcore:

Control-Z

suspenderá su proceso y le devolverá la identificación de trabajo de ese proceso

Entonces:

kill -9 %1

(reemplace 1 con su ID de trabajo).

Nota: ¡El porcentaje es obligatorio !, de lo contrario, matará su proceso de inicio, lo que significa que matará el kernel y todo el sistema se bloqueará (así que no ponga el espacio en el medio :)


0

Ctrl + c no matará el proceso. solo detendrá el proceso de ejecución actual en el medio. Para matar el proceso necesitamos usar el comando "KILL"


77
De hecho, killenvía una señal a un proceso. No lo mata. La señal predeterminada enviada con killes TERM, la señal enviada con ctrl+ces SIGINT.
fmanco

0

Me encontré con esta antigua publicación del foro sobre este tema en particular. Parece que la secuencia de interrupción predeterminada podría anularse en un archivo de configuración separado en alguna parte.

Si solo está buscando matar este proceso externamente, puede usar kill solo tenga en cuenta que debe escalar kill como se describe en este artículo sobre los procesos de asesinato , en lugar de simplemente saltar al asesinato más extremo -9.

Wikipedia es un gran recurso para el programa kill . También aquí hay una lista de señales de Unix y lo que hacen.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.