Estoy trabajando en una máquina Linux a través de SSH (Putty). Necesito dejar un proceso en ejecución durante la noche, así que pensé que podría hacerlo iniciando el proceso en segundo plano (con un signo y al final del comando) y redirigiendo stdout a un archivo.
Para mi sorpresa, eso no funciona. Tan pronto como cierro la ventana de Putty, el proceso se detiene.
¿Cómo puedo evitar que eso suceda?
linux
process
ssh
background-process
Liberarse
fuente
fuente
nohup command > /dev/null 2>&1 &
para ejecutar en segundo plano sin crear ningún resultado stdout o stderr (sinnohup.out
archivo)nohup
No ayuda en este caso. ¿Hay alguna manera de jugar conCtrl+Z
/bg
?Recomendaría usar GNU Screen . Le permite desconectarse del servidor mientras todos sus procesos continúan ejecutándose. No sé cómo viví sin él antes de saber que existía.
fuente
Cuando se cierra la sesión, el proceso recibe la señal SIGHUP que aparentemente no está captando. Puede usar el
nohup
comando al iniciar el proceso o el comando incorporado bashdisown -h
después de iniciar el proceso para evitar que esto suceda:fuente
daemonize? nohup? ¿PANTALLA? (tmux ftw, la pantalla es basura ;-)
Simplemente haga lo que todas las demás aplicaciones han hecho desde el principio: doble tenedor.
¡Explosión! Hecho :-) He usado esto innumerables veces en todo tipo de aplicaciones y en muchas máquinas antiguas. Puede combinarse con redireccionamientos y otras cosas para abrir un canal privado entre usted y el proceso.
Crear como coproc.sh:
y entonces
Y ahí tienes, engendras lo que sea. el <(:) abre una tubería anónima a través de la sustitución del proceso, que muere, pero la tubería se queda porque tienes un identificador. Por lo general, hago un en
sleep 1
lugar de:
porque es ligeramente picante, y obtengo un error de "archivo ocupado"; nunca sucede si se ejecuta un comando real (por ejemplo,command true
)"abastecimiento heredoc":
Esto funciona en cada shell que he probado, incluido busybox / etc (initramfs). Nunca lo había visto antes, lo descubrí de forma independiente mientras pinchaba, ¿quién sabía que la fuente podía aceptar argumentos? Pero a menudo sirve como una forma de evaluación mucho más manejable, si existe tal cosa.
fuente
ssh myhost "((exec sleep 500)&) >/dev/null"
ssh myhost 'sleep 500 >&- 2>&- <&- &'
TMTOWTDI;)Sustituya su nombre de proceso por bla!
fuente
Personalmente, me gusta el comando 'lote'.
Esto lo guarda en segundo plano y luego le envía los resultados por correo. Es parte del cron.
fuente
Como otros han señalado, para ejecutar un proceso en segundo plano para que pueda desconectarse de su sesión SSH, debe hacer que el proceso en segundo plano se disocie correctamente de su terminal de control, que es la pseudo-tty que utiliza la sesión SSH.
Puede encontrar información sobre procesos de demonización en libros como "Programa de red avanzada de Stevens, Vol. 1, 3ª Ed." O "Programación avanzada de Unix de Rochkind".
Recientemente (en los últimos años) tuve que lidiar con un programa recalcitrante que no se demonizó adecuadamente. Terminé lidiando con eso creando un programa de demonización genérico, similar a nohup pero con más controles disponibles.
El doble guión es opcional en sistemas que no utilizan la función GNU getopt (); es necesario (o debe especificar POSIXLY_CORRECT en el entorno) en Linux, etc. Dado que el doble guión funciona en todas partes, es mejor usarlo.
Todavía puede ponerse en contacto conmigo (nombre punto apellido en gmail punto com) si desea la fuente
daemonize
.Sin embargo, el código ahora está (finalmente) disponible en GitHub en mi repositorio SOQ (Stack Overflow Questions) como archivo
daemonize-1.10.tgz
en el subdirectorio de paquetes .fuente
En un sistema basado en Debian (en la máquina remota) Instale:
Uso:
Para cambiar el nombre de la sesión:
Para salir de la sesión:
(Esto deja la sesión tmux). Luego, puede cerrar sesión en SSH.
Cuando necesite regresar / verificarlo nuevamente, inicie SSH e ingrese
Te llevará de vuelta a tu sesión tmux.
fuente
Para la mayoría de los procesos, puede pseudo-demonizar usando este viejo truco de línea de comandos de Linux:
Por ejemplo:
Luego, inicie una nueva ventana de terminal y:
Mostrará que
sleep 30
todavía se está ejecutando.Lo que ha hecho es iniciar el proceso como hijo de un niño, y cuando sale, el
nohup
comando que normalmente desencadenaría el proceso de salida no cae en cascada hacia el nieto, dejándolo como un proceso huérfano, todavía ejecutándose .Yo prefiero este enfoque "establecer y olvidarse de él", no hay necesidad de hacer frente a
nohup
,screen
, tmux, I / O redirección, o cualquiera de esas cosas.fuente
Si usa la pantalla para ejecutar un proceso como root, tenga cuidado con la posibilidad de ataques de elevación de privilegios. Si su propia cuenta se ve comprometida de alguna manera, habrá una forma directa de hacerse cargo de todo el servidor.
Si este proceso necesita ejecutarse regularmente y tiene suficiente acceso en el servidor, una mejor opción sería usar cron para ejecutar el trabajo. También puede usar init.d (el super demonio) para comenzar su proceso en segundo plano, y puede terminar tan pronto como se haga.
fuente
nohup
es muy bueno si desea registrar sus datos en un archivo. Pero cuando pasa a segundo plano, no puede darle una contraseña si sus scripts lo solicitan. Creo que debes intentarloscreen
. es una utilidad que puede instalar en su distribución de Linux usando yum, por ejemplo, en CentOS yyum install screen
luego acceder a su servidor a través de masilla u otro software, en su tipo de shellscreen
. Se abrirá la pantalla [0] en masilla. Haz tu trabajo. Puede crear más pantalla [1], pantalla [2], etc. en la misma sesión de masilla.Comandos básicos que necesitas saber:
Para iniciar la pantalla
pantalla
Para c pantalla siguiente reate
ctrl + a + c
Para pasar a la pantalla n que creó
Ctrl + a + n
A d etach
Ctrl + a + d
Durante el trabajo cierra tu masilla. Y la próxima vez que inicies sesión con el tipo de masilla
pantalla -r
Para volver a conectarse a su pantalla, y puede ver su proceso aún ejecutándose en la pantalla. Y para salir de la pantalla, escriba #exit.
Para más detalles ver
man screen
.fuente
yum
es la herramienta correcta, cuando no conoces la distribución, no es bueno. debe dejar en claro en qué distribucionesscreen
se pueden instalaryum
.Nohup permite que un proceso del cliente no se elimine si se elimina un proceso principal, para discutir cuando cierre la sesión. Aún mejor aún use:
Nohup hace que el proceso que usted inicia sea inmune a la terminación, que su sesión SSH y sus procesos secundarios se anulan al cerrar sesión. El comando que le proporcioné le proporciona una forma de almacenar el pid de la aplicación en un archivo pid para que pueda eliminarlo correctamente más tarde y permita que el proceso se ejecute después de haber cerrado la sesión.
fuente
Usar pantalla. Es muy simple de usar y funciona como vnc para terminales. http://www.bangmoney.org/presentations/screen.html
fuente
Si también está dispuesto a ejecutar aplicaciones X, use xpra junto con "screen".
fuente
También iría para el programa de pantalla (sé que otra respuesta fue la pantalla, pero esta es una finalización)
no solo el hecho de que &, ctrl + z bg disown, nohup, etc. puede darte una desagradable sorpresa de que cuando cierres sesión, el trabajo seguirá siendo asesinado (no sé por qué, pero me pasó a mí, y no me molestó debido a que cambié para usar la pantalla, pero supongo que la solución anthonyrisinger como doble bifurcación resolvería eso), también la pantalla tiene una gran ventaja sobre la conexión a tierra:
y por cierto, esta es una pregunta que nunca haría en primer lugar :) ... uso la pantalla desde el principio para hacer cualquier cosa en cualquier Unix ... yo (casi) NUNCA trabajo en un shell de Unix / Linux sin iniciar la pantalla primero ... y debería parar ahora, o comenzaré una presentación interminable de lo que es una buena pantalla y qué puede hacer por usted ... búsquela usted mismo, vale la pena;)
fuente
&
(ejecución asíncrona) fue introducido por Thompson shell en 1971 , para la primera versión de UNIX ... así que literalmente "siempre ha sido" ;-) por desgracia, Fui demasiado conservador, en realidad han pasado 41 años.También está el comando daemon del paquete libslack de código abierto.
daemon
es bastante configurable y se preocupa por todas las tediosas cosas del demonio, como el reinicio automático, el registro o el manejo de archivos pid.fuente
Agregue esta cadena a su comando:> & - 2> & - <& - &. > & - significa stdout cercano. 2> & - significa stderr cercano. <& - significa stdin cercano. & significa ejecutar en segundo plano. Esto también funciona para iniciar un trabajo mediante programación mediante ssh:
fuente
Usé el comando de pantalla. Este enlace tiene detalles sobre cómo hacer esto
https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting
fuente
La respuesta aceptada sugiere usar nohup . Prefiero sugerir el uso de pm2 . Usar pm2 sobre nohup tiene muchas ventajas, como mantener viva la aplicación, mantener archivos de registro para la aplicación y muchas otras características más. Para más detalles mira esto .
Para instalar pm2 necesitas descargar npm . Para el sistema basado en Debian
y para Redhat
O puedes seguir estas instrucciones . Después de instalar npm, úselo para instalar pm2
Una vez hecho esto, puede iniciar su aplicación
Para la supervisión del proceso, utilice los siguientes comandos:
Administre los procesos utilizando el nombre de la aplicación o el id del proceso o administre todos los procesos juntos
Los archivos de registro se pueden encontrar en
Los archivos ejecutables binarios también se pueden ejecutar con pm2. Tienes que hacer un cambio en el archivo jason. Cambie el
"exec_interpreter" : "node"
, a"exec_interpreter" : "none".
(vea la sección de atributos ).Compilando el código anterior
y ejecutarlo con np2 en segundo plano
fuente
En systemd / Linux, systemd-run es una buena herramienta para iniciar procesos independientes de la sesión. Personas con odio van a odiar
fuente