Ctrl + c en un subproceso está matando un proceso nohup'ed anteriormente en el script

15

No sabía si esto pertenecía a SO (ya que es un error de codificación), pero pensé que ustedes tendrían más conocimiento sobre las sutilezas del software utilizado (por lo que tal vez incluso U&L podría considerarse).

Aquí está el script de código mínimo (vea las ediciones para el script completo, hay una razón por la que lo estoy haciendo de esta manera);

#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &

less +F currentOutput.log

Lo que intenta hacer es ejecutar un servidor en segundo plano, que sale a un archivo de registro.
Luego uso followese archivo de registro less +F. Mientras lo haces, para salir de esto debes presionar ctrl+ cantes de poder golpear Q.

Lo que sucede es que cuando I ctrl+ cdentro del lesscomando (detener tailing) de alguna manera mata al servidor que comenzó nohupen la parte superior. Nada más se ve afectado. Puedo shift+ fpara comenzar a seguir el registro nuevamente (que no obtiene información nueva ya que se mata el servidor) y si presiono Qel resto del script se ejecuta normalmente.

¿Sabes por que pasa esto? ¿Cómo evitarlo / algo más que debería estar usando?


PD
El programa del servidor puede estar escuchando a ^C, que puede ser el problema; ¿Hay algo que pueda hacer para detener eso? Al igual que cuando solo corro {SERVERCOMMAND}por sí solo (de manera bloqueante), puedo presionar ctrl+ c, que no lo mata de inmediato; se imprime Received ^C signal, shutting down(y luego se suicida). Esto es lo que sucede cuando ^Cen less(Un último Received ^C signal, shutting downse escribe en el registro).


PPS
He estado probando varias cosas (ninguna funcionó);

  • tratando de desconectar el stdin del script cambiando

    nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
    to
    nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 &
    or
    nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
  • utilizando stty intr ^Gpara reemplazar el comando de interrupción, pero luego ctrl+ ghizo exactamente lo que ^Cestaba haciendo de todos modos (por lo que este puede ser un problema con mi emulador de terminal en su lugar; konsole)

  • colocando la nohupy / o la lesslínea entre paréntesis (para que sea una subshell)

  • ejecutando el script en xtermlugar dekonsole

Hashbrown
fuente
Alguien puede haber encontrado mi problema; I think it is due to the handling within the database software, not on the shell. ¿Cómo haría un programa esto? ¿Cómo, entonces, podría detenerlo?
Hashbrown
3
nohupevita que el proceso reciba SIGHUPseñal mientras que CTRL + C envía SIGINTseñal. Por eso nohupno tiene el efecto que esperabas.
Piotr Dobrogost

Respuestas:

11

Tenía razón al pensar que se estaba SIGINTenviando a todos los procesos cuando ctrl+ c, pero era tonto al pensar que hacer otro proceso lo llevaría fuera del process group(ver mis intentos en el P.P.S.).

Este no es solo el caso de uso exacto, sino la solución correcta.

Debido a cómo mi guión estaba estructurado, la respuesta no encajaba textualmente, este es el guión ahora;

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

El servidor continúa enviando al archivo de registro después de I ctrl+ cin less.

Gracias por el tiempo de todos.

Hashbrown
fuente
0

¿Has probado disown ?

  disown -h %1

o sea cual sea tu trabajo; disown es un shell incorporado, su página de manual dice:

desconocer

disown [-ar] [-h] [jobspec ...]

Sin opciones, cada especificación de trabajo se elimina de la tabla de trabajos activos. Si la opción -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a 'nor -r' option is supplied, the current job is used. If no jobspec is supplied, the-a' significa eliminar o marcar todos los trabajos; la opción '-r' sin un argumento de especificación de trabajos restringe la operación a trabajos en ejecución.

EDITAR

Lo curioso, su construcción funciona en mi Arch Linux:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to nohup.out
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

Antes del comando ps , tuve que desplazar el archivo out.log, luego Ctrl+C, luego q.

MariusMatutiae
fuente
Sí, pero no sé cómo aplicarlo. Intenté colocar la nohuplínea en una función que en disownssí misma, pero que debería ser la misma que nohup. No creo que esto sea un SIGHUPproblema, ya que cuando less
elimino
@Hashbrown por favor vea mi edición
MariusMatutiae
Sí, también hice una prueba, con un simple script bash llamado en lugar de {SERVER} ejecutable. Y nohup simplemente funcionó bien. Vea mi comentario sobre la pregunta. Creo que está escuchando a propósito de alguna manera. Dado que es un servidor propio (y no muy conocido), ni siquiera puedo decir qué es para que alguien pueda decir "oh, está haciendo X, debes hacer Y"
Hashbrown