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 follow
ese 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 less
comando (detener tailing
) de alguna manera mata al servidor que comenzó nohup
en 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 ^C
en less
(Un último Received ^C signal, shutting down
se 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 ^G
para reemplazar el comando de interrupción, pero luego ctrl+ ghizo exactamente lo que^C
estaba haciendo de todos modos (por lo que este puede ser un problema con mi emulador de terminal en su lugar;konsole
)colocando la
nohup
y / o laless
línea entre paréntesis (para que sea una subshell)ejecutando el script en
xterm
lugar dekonsole
nohup
evita que el proceso reciba SIGHUP
señal mientras que CTRL + C envía SIGINT
señal. Por eso nohup
no tiene el efecto que esperabas.
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?