ver usar trabajos segundo plano ejecutar ejecuciones disown correr como comandos comando bash ssh csh

bash - usar - ver ejecuciones en segundo plano linux



Obtención de ssh para ejecutar un comando en segundo plano en la máquina de destino (12)

Redirigir fd''s

La salida debe ser redirigida con &>/dev/null que redirige tanto stderr como stdout a / dev / null y es un sinónimo de >/dev/null 2>/dev/null o >/dev/null 2>&1 .

Paréntesis

La mejor manera es usar sh -c ''( ( command ) & )'' donde command es cualquier cosa.

ssh askapache ''sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"''

Nohup Shell

También puedes usar nohup directamente para iniciar el shell:

ssh askapache ''nohup sh -c "( ( chown -R ask:ask /www/askapache.com &>/dev/null ) & )"''

Buen lanzamiento

Otro truco es usar nice para iniciar el comando / shell:

ssh askapache ''nice -n 19 sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"''

Esta es una pregunta complementaria de ¿Cómo se usa ssh en un script de shell? pregunta. Si quiero ejecutar un comando en la máquina remota que se ejecuta en segundo plano en esa máquina, ¿cómo obtengo el comando ssh para regresar? Cuando intento simplemente incluir el símbolo "&" al final del comando, simplemente se cuelga. La forma exacta del comando se ve así:

ssh user@target "cd /some/directory; program-to-execute &"

¿Algunas ideas? Una cosa a tener en cuenta es que los inicios de sesión en la máquina de destino siempre producen una pancarta de texto y tengo configuradas las claves SSH , por lo que no se requiere contraseña.


Creo que esto es lo que necesita: al principio necesita instalar sshpass en su máquina. entonces puedes escribir tu propio guión:

while read pass port user ip; do sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1 COMMAND 1 . . . COMMAND n ENDSSH1 done <<____HERE PASS PORT USER IP . . . . . . . . . . . . PASS PORT USER IP ____HERE


Creo que tendrás que combinar un par de estas respuestas para obtener lo que quieres. Si usas nohup junto con el punto y coma, y ​​envuelves todo en comillas, obtienes:

ssh user@target "cd /some/directory; nohup myprogram > foo.out 2> foo.err < /dev/null"

Lo que parece funcionar para mí. Con nohup, no necesita adjuntar & al comando para ejecutarse. Además, si no necesita leer ninguno de los resultados del comando, puede usar

ssh user@target "cd /some/directory; nohup myprogram > /dev/null 2>&1"

para redirigir toda la salida a / dev / null.


En realidad, cada vez que necesito ejecutar un comando en una máquina remota que es complicado, me gusta poner el comando en una secuencia de comandos en la máquina de destino, y simplemente ejecutar esa secuencia de comandos con ssh.

Por ejemplo:

# simple_script.sh (located on remote server) #!/bin/bash cat /var/log/messages | grep <some value> | awk -F " " ''{print $8}''

Y luego ejecuto este comando en la máquina fuente:

ssh user@ip "/path/to/simple_script.sh"


Esta ha sido la forma más limpia de hacerlo para mí:

ssh -n -f user@host "sh -c ''cd /whereever; nohup ./whatever > /dev/null 2>&1 &''"

Lo único que se ejecuta después de esto es el comando real en la máquina remota


Estaba tratando de hacer lo mismo, pero con la complejidad agregada que estaba tratando de hacerlo desde Java. Entonces, en una máquina que ejecuta java, estaba tratando de ejecutar un script en otra máquina, en segundo plano (con nohup).

Desde la línea de comandos, esto es lo que funcionó: (es posible que no necesite el "-i keyFile" si no lo necesita para ssh con el host)

ssh -i keyFile user@host bash -c "/"nohup ./script arg1 arg2 > output.txt 2>&1 &/""

Tenga en cuenta que para mi línea de comando, hay un argumento después de la "-c", que está entre comillas. Pero para que funcione en el otro extremo, todavía necesita las comillas, así que tuve que poner comillas escapadas dentro de él.

Desde Java, aquí está lo que funcionó:

ProcessBuilder b = new ProcessBuilder("ssh", "-i", "keyFile", "bash", "-c", "/"nohup ./script arg1 arg2 > output.txt 2>&1 &/""); Process process = b.start(); // then read from process.getInputStream() and close it.

Tomó un poco de prueba y error para que esto funcione, pero parece funcionar bien ahora.


Esto funcionó para mí muchas veces:

ssh -x remoteServer "cd yourRemoteDir; ./yourRemoteScript.sh </dev/null >/dev/null 2>&1 & "


La forma más rápida y sencilla es usar el comando ''at'':

ssh user @ target "en ahora -f /home/foo.sh"


Primero sigue este procedimiento:

Inicie sesión en A como usuario y genere un par de claves de autenticación. No ingrese una contraseña:

a@A:~> ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/a/.ssh/id_rsa): Created directory ''/home/a/.ssh''. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/a/.ssh/id_rsa. Your public key has been saved in /home/a/.ssh/id_rsa.pub. The key fingerprint is: 3e:4f:05:79:3a:9f:96:7c:3b:ad:e9:58:37:bc:37:e4 a@A

Ahora use ssh para crear un directorio ~ / .ssh como usuario b en B. (El directorio ya puede existir, lo cual está bien):

a@A:~> ssh b@B mkdir -p .ssh b@B''s password:

Finalmente, agregue la nueva clave pública de a a b @ B: .ssh / authorized_keys e ingrese la contraseña de b por última vez:

a@A:~> cat .ssh/id_rsa.pub | ssh b@B ''cat >> .ssh/authorized_keys'' b@B''s password:

A partir de ahora, puede iniciar sesión en B como b desde A como sin contraseña:

a@A:~> ssh b@B

entonces esto funcionará sin ingresar una contraseña

ssh b @ B "cd / some / directory; programa a ejecutar &"


Si no lo hace / no puede mantener la conexión abierta, puede usar la screen , si tiene los derechos para instalarla.

user@localhost $ screen -t remote-command user@localhost $ ssh user@target # now inside of a screen session user@remotehost $ cd /some/directory; program-to-execute &

Para separar la sesión de pantalla: ctrl-a d

Para listar sesiones de pantalla:

screen -ls

Para volver a adjuntar una sesión:

screen -d -r remote-command

Tenga en cuenta que la pantalla también puede crear múltiples shells dentro de cada sesión. Un efecto similar se puede lograr con tmux .

user@localhost $ tmux user@localhost $ ssh user@target # now inside of a tmux session user@remotehost $ cd /some/directory; program-to-execute &

Para separar la sesión tmux: ctrl-b d

Para listar sesiones de pantalla:

tmux list-sessions

Para volver a adjuntar una sesión:

tmux attach <session number>

La clave de control de tmux predeterminada, '' ctrl-b '', es algo difícil de usar, pero hay varios ejemplos de configuraciones de tmux que se envían con tmux que puede probar.


Solo quería mostrar un ejemplo de trabajo que puedes cortar y pegar:

ssh REMOTE "sh -c /"(nohup sleep 30; touch nohup-exit) > /dev/null &/""


Tuve este problema en un programa que escribí hace un año. Resulta que la respuesta es bastante complicada. Tendrá que usar nohup así como la redirección de salida, como se explica en el artículo de wikipedia en nohup , copiado aquí para su conveniencia.

Los trabajos en segundo plano de Nohuping son útiles, por ejemplo, cuando se inicia sesión a través de SSH, ya que los trabajos en segundo plano pueden hacer que el shell se bloquee al cerrar la sesión debido a una condición de carrera [2]. Este problema también se puede solucionar redireccionando las tres secuencias de E / S:

nohup myprogram > foo.out 2> foo.err < /dev/null &