Estoy trabajando para automatizar una rutina de mantenimiento que implica iniciar y detener un script que se ejecuta en una sesión de pantalla. Mi enfoque es finalizar la sesión de pantalla, luego reiniciarla y ejecutar el comando desde un script utilizando las capacidades para crear una pantalla y pasar un comando sin necesidad de conectarlo a la pantalla.
Sin embargo, tengo dificultades con esto. Puedo crear la pantalla correctamente sin que se adjunte usando screen -d -m -S screen_name
. Sin embargo, si ejecuto un comando basado en:
screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''
con echo -ne '\015' entre comillas invertidas en lugar de comillas simples. Es para simular que el usuario presiona la tecla Intro mientras los comandos que uso se mueven a un directorio y ejecutan un script ubicado allí. Este comando funciona, pero sólo si la pantalla se ha adjuntado una vez creada. Como intento automatizar el proceso de creación de la pantalla y ejecutar los comandos dentro de ella, me gustaría evitar tener que adjuntar y desconectar dentro de un script. Probaré la sugerencia de crear un script de shell que contenga los comandos que necesito ejecutar dentro de la pantalla y editar de acuerdo con mis resultados.
¿Hay alguna manera de crear una pantalla y ejecutar un comando dentro de la pantalla, ya sea en un solo comando o sin tener que adjuntarlo a la pantalla después de crear pero antes de ejecutar el comando?
Gracias de antemano.
**Actualización: después de haber probado la sugerencia de colocar los comandos que necesito ejecutar dentro de un script de shell, pude crear con éxito una pantalla y ejecutar los comandos desde dentro de la pantalla, pero obtengo el comportamiento de que cuando el script deja de ejecutarse La pantalla también se cierra. Esto no debería ser un problema ya que el script es un script de registro que solo debería detenerse con el conocimiento del administrador del sistema o mediante el script que estoy tratando de desarrollar; sin embargo, sería preferible tener la pantalla configurada de tal manera que la pantalla no desaparece si se detiene el script. ¿Es posible lograr este comportamiento? **
Respuesta1
Creo que es posible que te encuentres con varios problemas.
Si el comando finaliza antes de volver a conectarlo, la pantalla desaparecerá. Puedes hacer una demostración usando:
screen -d -m ls -l
Ejecutará el ls -l
comando, pero screen -list
no lo mostrará porque el proceso de la pantalla ha finalizado.
Tampoco tengo idea de lo que estás intentando hacer con estas cosas \015. Quizás sería útil actualizar tu pregunta, ya que lo que creo que estás intentando hacer es ejecutar varios comandos en una sesión de pantalla. Esto debería ser tan simple como:
screen -d -m bash -c "command1 ; command2 ; command3"
Si se usan mucho, tal vez debería crear un script de shell que ejecute solo estos comandos y luego usar uno más simple:
screen -d -m /path/to/script.sh
Respuesta2
Iniciar una pantalla separada
screen -dmS <screen name>
Ejecutar comando en pantalla separada creada previamente
screen -S <screen name> -X stuff '<CMD>\n'
Sí, debe escribir el símbolo Enter para enviar el comando o simplemente agregará la cadena a la pantalla.
Respuesta3
Esto hizo el trabajo para mí, sin -c
no estaba funcionando.
screen -d -m bash -c "command1; command2; command3"
Respuesta4
Una forma de copiar y pegar para probar respuestas anteriores es:
# No sessions:
screen -ls
# Returns immediately:
time screen -dmS screen_descritive_session_name bash -c 'sleep 20; hostname >> /tmp/h'
# New session present:
screen -ls
# File with return of command was created :)
sleep 20; cat /tmp/h
El resultado esperado debería ser similar a:
No Sockets found in /var/run/screen/S-yourusernamehere.
(Eso significa que no se creó ninguna sesión de pantalla previamente)
real 0m0.002s
user 0m0.000s
sys 0m0.000s
(Es el tiempo dedicado a crear una pantalla y separarse de ella. Casi instantáneo).
There is a screen on:
20318.screen_descritive_session_name (20/08/2018 16:29:35) (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.
(Este resultado muestra las sesiones de pantalla disponibles. Creado con el último comando).
sleep 20; cat /tmp/h
(Esto cat
muestra el nombre de host ejecutado dentro de gnu-screen)