como manter um script python em execução quando eu fechar putty

15

Estou prestes a executar um script python no Ubuntu no VPS. É um processo de treinamento em aprendizado de máquina, portanto, tenha muito tempo para treinar. Como posso fechar a massa sem interromper esse processo?

    
por chickensoup 29.04.2017 / 15:06

3 respostas

26

Você tem duas opções principais:

  1. Execute o comando com nohup . Isso irá desassociá-lo da sua sessão e deixá-lo continuar em execução depois que você se desconectar:

    nohup pythonScript.py
    

    Observe que o stdout do comando será anexado a um arquivo chamado nohup.out , a menos que você o redirecione ( nohup pythonScript.py > outfile ).

  2. Use um multiplexador de tela como tmux . Isso permitirá que você se desconecte da máquina remota, mas, da próxima vez que se conectar, se você executar tmux attach novamente, estará exatamente na mesma sessão. O comando ainda estará em execução (ele continuará sendo executado quando você sair) e você poderá ver sua stdout e stderr como se nunca tivesse feito o logout:

    tmux 
    pythonScript.py
    

    Depois de lançar isso, basta fechar a janela do PuTTY. Em seguida, conecte-se novamente no dia seguinte, execute tmux attach novamente e você estará de volta ao ponto de partida.

por 29.04.2017 / 15:18
1

A ferramenta screen , disponível para todas as distribuições Linux, suporta isso.

Para instalá-lo, execute apt-get install screen para distribuições Linux baseadas em deb ou dnf install -y screen ou yum install -y screen para os baseados em RPM.

Para usar:

$ screen

Um novo shell é iniciado. Neste shell, você pode iniciar seu script Python. Então você pode pressionar Ctrl + Deslocar + A então D . Ele irá separar seu terminal do shell que está executando seu script. Além disso, o script ainda está sendo executado nele.

Para ver como seu script está sendo executado, você pode chamar screen -r . Isso irá reconectar seu terminal ao shell com o script Python que você deixou executando em segundo plano.

UPD: como a Fox mencionou, a tela funciona mal com o systemd, mas podemos usar o systemd para iniciar o script, como eles dizem em exemplo oficial .

Por exemplo, se o seu script for iniciado por /usr/bin/myPythonScript , você pode criar o arquivo de unidade Systemd, assim.

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

[Unit]
Description=MyPythonScript

[Service]
ExecStart=/usr/bin/myPythonScript

[Install]
WantedBy=multi-user.target

Então, você pode iniciar este script %código% # systemctl daemon-reload

Se você quiser fazer este script iniciar automaticamente no início do sistema -

# systemctl start myPythonScript

Sempre que puder ver como seu script está sendo executado

# systemctl enable myPythonScript

Anúncio você pode revisar os registros do seu script

# systemctl status myPythonScript

    
por 30.04.2017 / 08:12
1

A maioria dos processos pode ser enganada redirecionando stdout, stderr, stdin (nem todos os descritores são sempre necessários para redirecionar) e usando o operador & control.

Veja que ping example.com 1>/dev/null & faz o trabalho.

Naturalmente, alguns programas são mais sofisticados e requerem soluções como @terdon mencionadas, mas é bom saber e usar o que melhor se encaixa.

EDIT: conforme escrito em esta resposta mata systemd processos no logout. Algumas versões de systemd matam processos no logout por padrão, outros não. Esse comportamento pode ser alterado modificando o /etc/systemd/logind.conf definindo a seguinte opção. Como está escrito, também pode resolver alguns problemas que você possa ter com as soluções da @ terdon.

de man logind.conf :

KillUserProcesses=

Takes a boolean argument. Configures whether the processes of a user should be killed when the user logs out. If true, the scope unit corresponding to the session and all processes inside that scope will be terminated. If false, the scope is "abandoned", see systemd.scope(5), and processes are not killed. Defaults to "yes", but see the options KillOnlyUsers= and KillExcludeUsers= below.

In addition to session processes, user process may run under the user manager unit [email protected]. Depending on the linger settings, this may allow users to run processes independent of their login sessions. See the description of enable-linger in loginctl(1).

Note that setting KillUserProcesses=yes will break tools like screen(1) and tmux(1), unless they are moved out of the session scope. See example in systemd-run(1).

Leia a resposta vinculada para saber mais.

    
por 29.04.2017 / 19:37

Tags