Ejecutar script en una pantalla

25

Quiero ejecutar un script bash en una pantalla separada. El script llama a un programa varias veces, cada uno de los cuales tarda demasiado en esperar. Mi primer pensamiento fue simplemente abrir una pantalla y luego llamar al script, pero parece que no puedo separar (by ctrl-a d) mientras el script se está ejecutando. Así que investigué un poco y encontré estas instrucciones para reemplazar el shebang con lo siguiente:

#!/usr/bin/screen -d -m -S screenName /bin/bash

Pero eso tampoco funciona (las opciones no se reconocen). ¿Alguna sugerencia?

PD: Hace un momento se me ocurre que screen -dmS name ./script.shprobablemente funcionaría para mis propósitos, pero todavía tengo curiosidad acerca de cómo incorporar esto en el guión. Gracias.

bongbang
fuente

Respuestas:

28

La línea shebang que has visto puede funcionar en algunas variantes de Unix, pero no en Linux. Las líneas shebang de Linux son limitadas: solo puede tener una opción. La cadena completa -d -m -S screenName /bin/bashse pasa como una sola opción a screen, en lugar de pasar como palabras diferentes.

Si desea ejecutar una secuencia de comandos dentro de la pantalla y no perder el tiempo con varios archivos o citas, puede hacer que la secuencia de comandos sea una secuencia de comandos de shell que invoca la pantalla si no está dentro de la pantalla.

#!/bin/sh
if [ -z "$STY" ]; then exec screen -dm -S screenName /bin/bash "$0"; fi
do_stuff
more_stuff
Gilles 'SO- deja de ser malvado'
fuente
Funciona bien, ¿ "$0"para qué sirve aquí?
Fabich
44
@ Lordofdark Ese es el nombre del script. El script invoca el screenque invoca el /bin/bashque invoca el script nuevamente.
Gilles 'SO- deja de ser malvado'
16

Según las páginas del manual de la pantalla:

  • screen -d -m Pantalla de inicio en modo separado. Esto crea una nueva sesión pero no se adjunta a ella. Esto es útil para los scripts de inicio del sistema.
  • -S sessionname Establezca el nombre de la nueva sesión en sessionname.

Entonces, cuando ejecuté el comando que proporcionaste: screen -dmS name ./script.sh

Screen inicia una ventana llamada name y ejecuta automáticamente ese script.sh. Para volver a ver el estado, simplemente escriba:screen -r test

Ahora con Ubuntu 14.04, los comandos son ligeramente diferentes. Tratar:

screen -d -m -S test

Ahora para ejecutar el script, deberá ir a su archivo de configuración para hacerlo:

sudo vim /etc/screenrc

Una vez allí, desplácese hacia abajo y verá:

# Example of automatically running some programs in windows on screen startup.
#
#   The following will open top in the first window, an ssh session to monkey
#   in the next window, and then open mutt and tail in windows 8 and 9
#   respectively.
#
# screen top
# screen -t monkey ssh monkey
# screen -t mail 8 mutt
# screen -t daemon 9 tail -f /var/log/daemon.log

Esta es la sección donde necesitará agregar el nombre del script para ejecutar y eso debería permitirle hacer todo lo que necesita desde la pantalla.

ryekayo
fuente
De alguna manera, ese comando ( screen -dmS ...) no funciona para mí, aunque realmente debería. Lo ejecuto y luego screen -lsno se encuentran enchufes. Pensamientos?
bongbang
¿Qué distro está usando?
ryekayo
NOMBRE = "Ubuntu" VERSIÓN = "14.04.1 LTS, Trusty Tahr" Creo. Es una máquina virtual.
bongbang
Dame un poco porque estoy dejando el trabajo e intentaré usar la pantalla en mi máquina, que también es ubuntu 14.04
ryekayo
@bongbang: ¿qué versión de pantalla tienes?
slm
3

Esto es un poco viejo pero uno de los pocos hilos que pude encontrar para hacer esto. Después de jugar alrededor de la única forma de hacer que esto se ejecute en modo separado con ubuntu 14. es

screen -d -m -t nameofwindow sh nameoflaunch.sh

El lanzamiento sería la segunda parte anterior que contiene los comandos java actuales y la versión del servidor. Yo corro vainilla.

ProjectEd
fuente