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
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?nohup
evita que el proceso recibaSIGHUP
señal mientras que CTRL + C envíaSIGINT
señal. Por esonohup
no tiene el efecto que esperabas.Respuestas:
Tenía razón al pensar que se estaba
SIGINT
enviando 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
nohup
línea en una función que endisowns
sí misma, pero que debería ser la misma quenohup
. No creo que esto sea unSIGHUP
problema, ya que cuandoless