cómo mantener un script de Python ejecutándose cuando cierro PuTTY

cómo mantener un script de Python ejecutándose cuando cierro PuTTY

Estoy a punto de ejecutar un script de Python en Ubuntu en VPS. Es un proceso de capacitación en aprendizaje automático, por lo que tómate mucho tiempo para capacitarte. ¿Cómo puedo cerrar PuTTY sin detener ese proceso?

Respuesta1

Tienes dos opciones principales:

  1. Ejecute el comando con nohup. Esto lo desasociará de su sesión y permitirá que continúe ejecutándose después de que se desconecte:

    nohup pythonScript.py
    

    Tenga en cuenta que la salida estándar del comando se agregará a un archivo llamado nohup.outa menos que lo redirija ( nohup pythonScript.py > outfile).

  2. Utilice un multiplexor de pantalla como tmux. Esto le permitirá desconectarse de la máquina remota pero, la próxima vez que se conecte, si ejecuta tmux attachnuevamente, 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 salida estándar y su stderr como si nunca hubiera cerrado la sesión:

    tmux 
    pythonScript.py
    

    Una vez que lo hayas iniciado, simplemente cierra la ventana de PuTTY. Luego, conéctate nuevamente al día siguiente, tmux attachvuelve a ejecutar y estarás de nuevo donde empezaste.

Respuesta2

ElscreenLa herramienta, disponible para todas las distribuciones de Linux, lo admite.

Para instalarlo, ejecútelo apt-get install screenpara distribuciones de Linux basadas en Deb o dnf install -y screenpara yum install -y screendistribuciones basadas en RPM.

Usar:

$ screen

Se inicia un nuevo caparazón. En este shell, puede iniciar su script Python. Luego puedes presionar Ctrl+ Shift+ Ay luego D. Separará su terminal del shell que ejecuta su script. Además, el script todavía se está ejecutando.

Para ver cómo se está ejecutando su script, puede llamar screen -r. Esto volverá a conectar su terminal al shell con el script de 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 enejemplo oficial.

Por ejemplo, si su secuencia de comandos se inicia con /usr/bin/myPythonScript, puede crear un archivo de unidad Systemd, como este.

$ cat /etc/systemd/system/myPythonScript.service

[Unit]
Description=MyPythonScript

[Service]
ExecStart=/usr/bin/myPythonScript

[Install]
WantedBy=multi-user.target

Luego, puedes iniciar 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 podrás ver cómo se está ejecutando tu script.

# systemctl status myPythonScript

Anuncio puedes revisar los registros de tu script.

# journalctl -u myPythonScript -e

Respuesta3

La mayoría de los procesos pueden engañarse redirigiendo su salida estándar, stderr, stdin (no siempre es necesario redirigir todos los descriptores) y utilizando &el 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 que mencionó @terdon, pero es bueno saber y utilizar cuál se adapta mejor.

EDITAR: como está escrito enesta respuestamata systemdlos procesos al cerrar sesión. Algunas versiones de systemdprocesos de eliminación 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 finalizar cuando el usuario cierra la sesión. Si es verdadero, se terminará la unidad de alcance correspondiente a la sesión y todos los procesos dentro de ese alcance. Si es falso, el alcance se "abandona", consulte systemd.scope(5), y los procesos no se eliminan. El valor predeterminado es "sí", pero consulte las opciones KillOnlyUsers=a KillExcludeUsers=continuación.

Además de los procesos de sesión, el proceso de usuario puede ejecutarse en la unidad de administrador de usuarios.[correo electrónico protegido]. Dependiendo de la configuración de permanencia, esto puede permitir a los usuarios ejecutar procesos independientemente de sus sesiones de inicio de sesión. Ver la descripción de enable-lingeren loginctl(1).

Tenga en cuenta que la configuración KillUserProcesses=yesinterrumpirá herramientas como screen(1) y tmux(1), a menos que se saquen del alcance de la sesión. Ver ejemplo en systemd-run(1).

Lea la respuesta vinculada para obtener más información.

información relacionada