Tengo un proceso de servidor de larga duración dentro de una sesión de pantalla en mi servidor Linux. Es un poco inestable (y lamentablemente no es mi software, ¡así que no puedo solucionarlo!), Por lo que quiero realizar un reinicio nocturno del proceso para ayudar a la estabilidad. La única forma de hacer que se apague correctamente es ir al proceso de la pantalla, cambiar a la ventana en la que se está ejecutando e ingresar la cadena "stop" en su consola de control.
¿Hay alguna contorsión de redirección inteligente que pueda hacer para que un cronjob envíe ese comando de detención a una hora fija todos los días?
ls -l /proc/7417/fd/0
./dev/pts/19
), ely
personaje no llega a la aplicación en sí. Es similar a lo que sucede cuando usa el comando write (1) . De todos modos, prueba mi otra respuesta o una herramienta de automatización gráfica como xdotool .Solución basada en pantalla
Inicie el servidor de esta manera:
la pantalla se iniciará en modo separado, por lo que si desea ver lo que está sucediendo, ejecute:
Controla el servidor de esta manera:
(esta respuesta se basa en el envío de entrada de texto a una pantalla separada desde el sitio hermano de Unix y Linux )
Explicación de los parámetros:
solución basada en tmux
Inicie el servidor de esta manera:
tmux comenzará en modo separado, así que si quieres ver lo que está pasando, ejecuta:
Controla el servidor de esta manera:
Explicación de los parámetros:
fuente
Prueba esto para comenzar:
Y esto para matar:
fuente
echo "xxx" > cmd
se detendrá (porque la tubería se cerrará). Aunque algunos programas son lo suficientemente inteligentes como para volver a abrir (rewind(3)
) su stdin cuando se encuentran con EOF.Es posible enviar texto de entrada a un proceso en ejecución sin ejecutar la
screen
utilidad o cualquier otra utilidad sofisticada. Y se puede hacer enviando este texto de entrada al "archivo" de entrada estándar del proceso/proc/PID#/fd/0
.Sin embargo, el texto de entrada debe enviarse de una manera especial para que el proceso lo lea. Enviar el texto de entrada a través del
write
método de archivo normal no hará que el proceso reciba el texto. Esto se debe a que hacerlo solo se agregará a ese "archivo", pero no activará el proceso para leer los bytes.Para activar el proceso para leer los bytes, es necesario realizar una
IOCTL
operación de tipoTIOCSTI
por cada byte que se envíe. Esto colocará el byte en la cola de entrada estándar del proceso.Esto se discute aquí con algunos ejemplos en C, Perl y Python:
https://unix.stackexchange.com/questions/48103/construct-a-command-by-putting-a-string-into-a-tty/48221
-
Entonces, para responder la pregunta original que se hizo hace casi 9 años, el trabajo cron necesitaría ejecutar un pequeño script / programa de utilidad similar a los ejemplos que la gente escribió para esa otra pregunta, que enviaría la cadena "stop \ n" a ese proceso del servidor en la pregunta, enviando cada uno de los 5 bytes a través de una
IOCTL
operación de tipoTIOCSTI
.Por supuesto, esto solo funcionará en sistemas que admitan el
TIOCSTI
IOCTL
tipo de operación (como Linux), y solo desde laroot
cuenta de usuario, ya que estos "archivos"/proc/
son "propiedad" de ellosroot
.fuente
En caso de que ayude a alguien:
tuve un problema similar, y como el proceso que estaba usando no estaba bajo
screen
otmux
, tuve que adoptar un enfoque diferente.Os adjunto
EDITARgdb
a laxterm
que mi proceso se ejecuta en, y se utilizacall write(5, "stop\n", 5)
degdb
escribir en el descriptor de archivo pty maestro.Descubrí a qué descriptor de archivo enviar los datos buscando
/proc/<pid>/fd
un enlace/dev/ptmx
y luego prueba y error entre las dos opciones (enviar mi cadena a ambos descriptores de archivo coincidentes parecía no causar ningún daño).Resultó que el
EDICIÓN FINALxterm
proceso al que me había adjuntado se generó con laspawn-new-terminal()
xterm
acción de una combinación de teclas, y el segundoptmx
descriptor de archivo abierto era simplemente elptmx
delxterm
proceso principal que no se había cerrado.Por lo tanto, las llamadas de prueba y error habían enviado salida a ese otro terminal.
La mayoría de los
xterm
procesos no tienen dosptmx
descriptores de archivo.Esto efectivamente escribió esa cadena en la terminal y, por lo tanto, la envió al proceso que se ejecuta debajo de ella.
Nota: es posible que deba permitir adjuntar a un proceso en ejecución con algo como
sudo bash -c "echo 0 > /proc/sys/kernel/yama/ptrace_scope"
fuente
Como no puedo comentar la respuesta más aceptada de Cristian Ciupitu (de 2010), tengo que poner esto en una respuesta separada:
Esta pregunta ya se resolvió en este hilo: https://stackoverflow.com/questions/5374255/how-to-write-data-to-existing-processs-stdin-from-external-process
En breve:
Debe comenzar su proceso con una tubería para stdin que no bloquea ni cierra cuando se escribió la entrada actual. Esto se puede implementar mediante un bucle sin fin simple que se canalizará al proceso en cuestión:
Puedo confirmar que esto es diferente de la forma en que Krissi abre una tubería que no funcionaba en mi caso. La solución mostrada funcionó en su lugar.
Luego puede escribir en el archivo ... / fd / 0 del proceso para enviarle instrucciones. El único inconveniente es que también debe terminar el proceso bash, que está ejecutando el bucle sin fin después de que el servidor se apagó.
fuente