Estoy a punto de ejecutar un script de Python en Ubuntu en VPS. Es un proceso de entrenamiento de aprendizaje automático, así que tómate un tiempo enorme para entrenar. ¿Cómo puedo cerrar la masilla sin detener ese proceso?
Estoy a punto de ejecutar un script de Python en Ubuntu en VPS. Es un proceso de entrenamiento de aprendizaje automático, así que tómate un tiempo enorme para entrenar. ¿Cómo puedo cerrar la masilla sin detener ese proceso?
Respuestas:
Tienes dos opciones principales:
Ejecute el comando con nohup
. Esto lo desasociará de su sesión y permitirá que continúe ejecutándose después de desconectarlo:
nohup pythonScript.py
Tenga en cuenta que la stdout del comando se agregará a un archivo llamado a nohup.out
menos que lo redirija ( nohup pythonScript.py > outfile
).
Use un multiplexor de pantalla como tmux
. Esto le permitirá desconectarse de la máquina remota, pero luego, la próxima vez que se conecte, si tmux attach
vuelve a ejecutar , se encontrará exactamente en la misma sesión. El comando seguirá ejecutándose (continuará ejecutándose cuando cierre la sesión) y podrá ver su stdout y stderr como si nunca hubiera cerrado la sesión:
tmux
pythonScript.py
Una vez que hayas lanzado eso, solo cierra la ventana PuTTY. Luego, conéctese nuevamente al día siguiente, tmux attach
vuelva a ejecutar y estará de regreso donde comenzó.
disown
2.screen
byobu
, un contenedor alrededor de tmux o screen.
La screen
herramienta, disponible para todas las distribuciones de Linux, es compatible con esto.
Para instalarlo, ejecuta apt-get install screen
para distribuciones Linux basadas en deb, dnf install -y screen
o yum install -y screen
para distribuciones basadas
en RPM.
Usar:
$ screen
Se inicia un nuevo shell. En este shell, puede iniciar su script Python. Entonces puedes presionar Ctrl+Shift + y Aluego D. Separará su terminal del shell que ejecuta su script. Además, el script todavía se está ejecutando en él.
Para ver cómo se ejecuta su script, puede llamar screen -r
. Esto volverá a conectar su terminal al shell con el script Python que dejó ejecutándose en segundo plano.
UPD: como mencionó Fox, la pantalla funciona mal con systemd, pero podemos usar systemd para iniciar el script, como dicen en ejemplo oficial .
Por ejemplo, si su secuencia de comandos es iniciada por /usr/bin/myPythonScript
, puede crear un archivo de unidad Systemd, de esta manera.
$ cat /etc/systemd/system/myPythonScript.service
[Unit]
Description=MyPythonScript
[Service]
ExecStart=/usr/bin/myPythonScript
[Install]
WantedBy=multi-user.target
Entonces, puedes comenzar este script
# systemctl daemon-reload
# systemctl start myPythonScript
Si desea que este script se inicie automáticamente al iniciar el sistema:
# systemctl enable myPythonScript
En cualquier momento puede ver cómo se ejecuta su script
# systemctl status myPythonScript
Anuncio puede revisar los registros de su secuencia de comandos
# journalctl -u myPythonScript -e
screen
no funciona exactamente bien systemd
en su configuración predeterminada. No sé si Ubuntu usa systemd
, pero vale la pena mencionar el comportamiento y la solución en su respuesta
La mayoría de los procesos pueden ser engañados redirigiendo sus stdout, stderr, stdin (no todos los descriptores son siempre necesarios para redirigir) y usando &
operador de control.
Mira eso ping example.com 1>/dev/null &
hace el trabajo.
Por supuesto, algunos programas son más sofisticados y requieren soluciones como las mencionadas en @terdon, pero es bueno saber y usar lo que mejor se adapte.
EDITAR: como está escrito en esta respuesta, mata los systemd
procesos al cerrar sesión. Algunas versiones de systemd
procesos de cierre al cerrar sesión de forma predeterminada, otras no. Este comportamiento se puede cambiar modificando /etc/systemd/logind.conf configurando la siguiente opción. Tal como está escrito, también puede resolver algunos problemas que pueda tener con las soluciones de @terdon.
de man logind.conf
:
KillUserProcesses=
Toma un argumento booleano. Configura si los procesos de un usuario deben eliminarse cuando el usuario cierra la sesión. Si es verdadero, la unidad de alcance correspondiente a la sesión y todos los procesos dentro de ese alcance finalizarán. Si es falso, el alcance está "abandonado", consulte systemd.scope (5), y los procesos no se eliminan. El valor predeterminado es "sí", pero vea las opciones
KillOnlyUsers=
yKillExcludeUsers=
abajo.Además de los procesos de sesión, el proceso de usuario puede ejecutarse bajo la unidad de administrador de usuarios user @ .service. Dependiendo de la configuración persistente, esto puede permitir a los usuarios ejecutar procesos independientes de sus sesiones de inicio de sesión. Ver la descripción de
enable-linger
enloginctl
(1).Tenga en cuenta que la configuración
KillUserProcesses=yes
interrumpirá herramientas comoscreen
(1) ytmux
(1), a menos que se salgan del alcance de la sesión. Ver ejemplo ensystemd-run
(1).
Lea la respuesta vinculada para obtener más información.
isatty()
y sale si no es así?"
nohup
.