shell - una - dar permisos a un usuario especifico en linux
cómo ejecutar un comando en el fondo usando ssh y separar la sesión (5)
¿Qué piensas sobre usar la screen
para esto? Podría ejecutar la screen
través de ssh para iniciar el comando ( concat.sh
) y luego podría volver a la sesión de la pantalla si deseara controlarla (podría ser útil, dependiendo de lo que haga Concat).
Para ser más específico, intente esto:
ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh
Debería encontrar que el aviso vuelve inmediatamente, y que concat.sh
está ejecutando en la máquina remota. Explicaré algunas de las opciones:
-
ssh -t
hace un TTY. la pantalla necesita esto -
screen -dm
hace iniciar en modo "separado". Esto es como "fondo" para sus propósitos. -
-S
testing le da un nombre a su sesión de pantalla. Es opcional pero recomendado.
Ahora, una vez que haya hecho esto, puede ir a la máquina remota y ejecutar esto:
screen -r testing
Esto lo conectará a la sesión de pantalla que contiene su programa. Desde allí puedes controlarlo, matarlo, ver su salida, etc. Ctrl-A, luego d lo desconectará de la sesión de pantalla. screen -ls
mostrarán todas las sesiones en ejecución.
Actualmente estoy tratando de ingresar a una máquina remota y ejecutar una secuencia de comandos, luego dejar el nodo con la secuencia de comandos en ejecución. A continuación está mi script. Sin embargo, cuando se ejecuta, el script se ejecuta correctamente en la máquina, pero la sesión de ssh se bloquea. ¿Cuál es el problema?
ssh -x $username@$node ''rm -rf statuslist
mkdir statuslist
chmod u+x ~/monitor/concat.sh
chmod u+x ~/monitor/script.sh
nohup ./monitor/concat.sh &
exit;''
A continuación hay una decisión mucho más común que requirió algunos esfuerzos para encontrar, y realmente funciona para mí:
#!/usr/bin/bash
theScreenSessionName="test"
theTabNumber="1"
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top"
echo "this is a test"
ssh -f user@server "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff /"
$theStuff
/""
Envía la lista de comandos $ theStuff a la pestaña No $ theTabNumber de la sesión de pantalla $ theScreenSessionName creada preliminarmente en el ''servidor'' en nombre de ''usuario''.
Tenga en cuenta un espacio en blanco al final después de "X cosas" que se envía para superar un error de la opción "cosas". El espacio en blanco y $ theStuff en la línea siguiente se añaden con las teclas ''Enter'' (^ M). ''¡EM!
El mensaje "esto es una prueba" se repite en el terminal inicial, y los comandos $ theStuff se ejecutan realmente dentro de la pantalla / pestaña mencionada.
Hay algunas situaciones en las que desea ejecutar / iniciar algunos scripts en una máquina / servidor remoto (que terminará automáticamente) y desconectarse del servidor.
Ejemplo: un script que se ejecuta en un cuadro que cuando se ejecuta
- toma un modelo y lo copia a un servidor remoto
- crea un script para ejecutar una simulación con el modelo y lo envía al servidor
- inicia el script en el servidor y desconecta
- El deber del script iniciado es ejecutar la simulación en el servidor y una vez completada (llevará días completarla) copiar los resultados al cliente.
Yo usaría el siguiente comando:
ssh remoteserver ''nohup /path/to/script `</dev/null` >nohup.out 2>&1 &''
@CKeven, puede poner todos esos comandos en un script, empujarlo al servidor remoto e iniciarlo de la siguiente manera:
echo ''#!/bin/bash
rm -rf statuslist
mkdir statuslist
chmod u+x ~/monitor/concat.sh
chmod u+x ~/monitor/script.sh
nohup ./monitor/concat.sh &
'' > script.sh
chmod u+x script.sh
rsync -azvp script.sh remotehost:/tmp
ssh remotehost ''/tmp/script.sh `</dev/null` >nohup.out 2>&1 &''
Espero que esto funcione ;-)
Editar: También puede usar la pantalla del usuario ssh @ host -S Nombre de sesión -d -m "/ ruta / a / ejecutable" ''
Que crea una sesión de pantalla separada y ejecuta el comando de destino dentro de ella
Para mí, solo esto funcionó:
screen -dmS name sh my-script.sh
Esto, por supuesto, depende de la pantalla, y le permite adjuntarlo más tarde, si alguna vez quiere stdin o stdout. La pantalla se terminará cuando my-script.sh finalice.
Podría ser el flujo de entrada estándar. Pruebe ssh -n ...
o ssh -f ...