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 lalesslínea entre paréntesis (para que sea una subshell)ejecutando el script en
xtermlugar dekonsole

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?nohupevita que el proceso recibaSIGHUPseñal mientras que CTRL + C envíaSIGINTseñal. Por esonohupno tiene el efecto que esperabas.Respuestas:
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 delprocess group(ver mis intentos en elP.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;
El servidor continúa enviando al archivo de registro después de I ctrl+ cin
less.Gracias por el tiempo de todos.
fuente
¿Has probado disown ?
o sea cual sea tu trabajo; disown es un shell incorporado, su página de manual dice:
EDITAR
Lo curioso, su construcción funciona en mi Arch Linux:
Antes del comando ps , tuve que desplazar el archivo out.log, luego Ctrl+C, luego q.
fuente
nohuplínea en una función que endisownssí misma, pero que debería ser la misma quenohup. No creo que esto sea unSIGHUPproblema, ya que cuandoless