2010-11-06 6 views
7

Quiero empezar una secuencia de comandos de forma remota a través de SSH como esto:script de inicio remoto a través de ssh que contiene nohup

ssh [email protected] -t 'cd my/dir && ./myscript data [email protected]' 

El script hace varias cosas que funcionan bien hasta que se trata de una línea con nohup:

nohup time ./myprog $1 >my.log && mutt -a ${1%.*}/`basename $1` -a ${1%.*}/`basename ${1%.*}`.plt $2 < my.log 2>&1 & 

se supone que debe iniciar el programa myprog, canalizar su salida a mylog y enviar un correo electrónico con algunos archivos de datos creados por myprog como archivo adjunto y el registro como cuerpo. Sin embargo, cuando el script llega a esta línea, las salidas ssh son:

Conexión a remote.org cerrada.

¿Cuál es el problema aquí?

Gracias por cualquier ayuda

+1

se obtiene el correo -¿correo? – thejh

+0

No. ni myprog se inicia ni se envía mutt. Para probarlo, compruebe lo que está sucediendo. También mi.el registro está vacío (el script lo toca antes). – litro

+0

¿Qué escribiría './Myprog' en stdout si sus argumentos son incorrectos? ¿Qué contiene 'myerr.log' cuando escribe' ./myprog $ 1> my.log 2> myerr.log'? – thejh

Respuesta

5

Su comando ejecutan una tubería de procesos en segundo plano, por lo que el guión de llamada terminará de inmediato (o muy poco después). Esto hará que ssh cierre la conexión. Esto, a su vez, provocará que se envíe un SIGHUP a cualquier proceso conectado al terminal que causó la creación de la opción -t.

Su proceso time ./myprog está protegido por un nohup, por lo que debe seguir funcionando. Pero su mutt no lo está, y ese es probablemente el problema aquí. Le sugiero que cambie su línea de comando a:

nohup sh -c "time ./myprog $1 >my.log && mutt -a ${1%.*}/`basename $1` -a ${1%.*}/`basename ${1%.*}`.plt $2 < my.log 2>&1 " & 

para proteger toda la tubería. (Si eso no lo soluciona, puede ser necesario hacer algo con los descriptores de archivos, por ejemplo, mutt puede tener otros problemas con el terminal que no está presente, o las citas pueden necesitar ajustes según los parámetros, pero pruébelo para ahora ...)

5

This answer puede ser útil. En resumen, para lograr el efecto deseado, hay que hacer las siguientes cosas:

  1. redirigir todas las E/S en el mando a distancia nohup'ed
  2. comunicar al comando SSH local para salir tan pronto como se ha hecho comenzando el (los) proceso (s) remoto (s)

Citando the answer I already mentioned, en su vez se cita wikipedia:

Nohuping empleos backgrounded es por ejemplo útil cuando se haya identificado a través de SSH, puesto que los empleos backgrounded pueden causar la cáscara para colgar en cierre de sesión debido a una condición de carrera [ 2]. Este problema también puede ser superada mediante la reorientación de las tres I/O corrientes:

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

ACTUALIZACIÓN

Acabo de tener éxito con este patrón:

ssh -f [email protected] 'sh -c "((nohup command-to-nohup 2>&1 >output.file </dev/null) &)"' 
+1

¿Qué significa

Cuestiones relacionadas