¿Cómo ejecutar un comando en pantalla y separar?

75

¿Cómo puedo hacer que la pantalla ejecute un comando y luego se separe (es decir, automáticamente en un solo script sin más información más allá del inicio inicial del script)? por ejemplo, ejecuto myscript.sh e inicia automáticamente una sesión de pantalla, ejecuta un comando y luego se desconecta.

darkfeline
fuente

Respuestas:

114

Esta es una fácil:

screen -d -m yourcommand
Alan Curry
fuente
44
no dados. comando screen -d -m, screen -list dice no sockets, screen -r no sessions
darkfeline
1
De alguna manera, su comando no se encontró o no funciona correctamente en el entorno de pantalla creado automáticamente. Intenta simplemente screen yourcommandprescindir de -dy -my verás cómo va eso primero.
Alan Curry
Tienes algo de razón. La pantalla finaliza cuando finaliza el comando, en contra de mis expectativas. Pero tu respuesta funciona.
darkfeline
3
Puede cambiar eso habilitando la zombieopción en pantalla. Poner zombie xyen tu ~/.screenrc. También debería ser posible habilitarlo para una sesión solo b colocando zombie xyotro archivo y usando, -c filepero por alguna razón eso no funciona cuando lo intento. O simplemente usesh -c 'yourcommand;while :;do sleep 9999; done'
Alan Curry
@AlanCurry, No, esto tampoco funciona para mí, a pesar de que el comando se ejecuta perfectamente (y lleva varias horas) cuando se ejecuta en una pantalla manualmente.
Cerin
47

Para ejecutar un solo comando en la pantalla y desconectar, puede intentar:

screen -dm sleep 10

Para ejecutar varios comandos, intente:

screen -dm bash -c "sleep 10; myscript.sh"

Tenga en cuenta que cuando un programa finaliza, la pantalla (por defecto) mata la ventana que lo contenía.

Si no desea que su sesión sea eliminada después de que finalice el script, agregue exec shal final, por ejemplo:

screen -dm bash -c 'sleep 5; exec sh'

Para enumerar todas sus sesiones, intente:

screen -list

Relacionado: Iniciar pantalla de Unix, Ejecutar comando, Separar .

kenorb
fuente
2
Esto funcionó para mí en Ubuntu 16.04. Además del nombre de la sesión para que pueda volver a ella más tarde, añadir -S sessionname: screen -dmS MyLongRunningScript bash -c "...".
Dan Dascalescu
16

Para comenzar una nueva sesión en segundo plano con el nombre 'sueño'

screen -S sleepy -dm sleep 60

Para matar la sesión 'soñolienta'

screen -S sleepy -X quit      
Michal Zmuda
fuente
¿Por qué no funciona así screen -S sleepy -dm "cd myfolder;sleep 60"?
Toolkit
@Toolkit El problema es que tiene el comando entre comillas, por lo que se trató como un comando grande. Obviamente no podemos sacarlo de las comillas debido al punto y coma. Para resolver esto, ejecute el comando de la siguiente manera: screen -S sleepy -dm bash -c "cd myfolder; sleep 60"
Jason Thompson
3
screen -dmS screen_session_name bash -c 'echo "doing stuff"; exec bash'
tkjef
fuente
0

me sucedió cuando presioné el control c (sig int) para salir de mi programa. sale de todo bash. así que encontré esto para atrapar a SIGINT. e impedir la salida de la última fiesta. (necesita escribir exit para salir)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

Me resulta útil usar cron para ejecutar programas nodejs en el inicio. y para ejecutar la pantalla en el momento del arranque. en cron hay eventos especiales sintaxis @reboot event

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
Shimon Doodkin
fuente