como manter um script python em execução quando fecho a massa

19

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

sopa de galinha
fonte
11
Confira nohup.
Php

Respostas:

36

Você tem duas opções principais:

  1. Execute o comando com nohup. Isso o desassociará da sua sessão e continuará sendo executado depois que você se desconectar:

    nohup pythonScript.py

    Observe que o stdout do comando será anexado a um arquivo chamado, a nohup.outmenos 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, na próxima vez que você se conectar, se executar tmux attachnovamente, você estará exatamente na mesma sessão. O comando ainda estará em execução (continuará em execução quando você sair) e você poderá ver o stdout e o stderr como se nunca tivesse saído:

    tmux 
    pythonScript.py

    Depois de iniciá-lo, basta fechar a janela PuTTY. Em seguida, conecte-se novamente no dia seguinte, execute tmux attachnovamente e você estará de volta onde começou.

terdon
fonte
4
Alternativas a 1 & 2: 1. disown2.screen
heemayl 29/04
Também vale a pena mencionar byobu, um wrapper em torno do tmux ou da tela.
bli
2

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

Para instalá-lo, execute apt-get install screenpara distribuições Linux baseadas em deb, ou dnf install -y screenou yum install -y screenpara aquelas baseadas em RPM.

Usar:

$ screen

Um novo shell é iniciado. Nesse shell, você pode iniciar seu script Python. Então você pode pressionar Ctrl+ Shift+ Aentão D. Ele desanexará 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 ligar screen -r. Isso reconectará seu terminal ao shell com o script Python que você deixou em execução em segundo plano.

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

Por exemplo, se seu script for iniciado /usr/bin/myPythonScript, você poderá 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 esse script # systemctl daemon-reload # systemctl start myPythonScript

Se você deseja que esse script seja iniciado automaticamente na inicialização do sistema -

# systemctl enable myPythonScript

A qualquer momento, você pode ver como seu script está sendo executado

# systemctl status myPythonScript

Anúncio, você pode revisar os logs do seu script

# journalctl -u myPythonScript -e

vodolaz095
fonte
Observe que screennão é exatamente compatível com systemdsua configuração padrão. Eu não sei se utiliza Ubuntu systemd, mas o comportamento ea solução alternativa pode valer a pena mencionar em sua resposta
Fox
1

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

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

Certamente, alguns programas são mais sofisticados e exigem soluções como a @terdon mencionada, mas é bom saber e usar o que melhor se adequa.

EDIT: como escrito nesta resposta mata systemdprocessos no logout. Algumas versões dos systemdprocessos de interrupção no logout, por padrão, outras não. Esse comportamento pode ser alterado modificando /etc/systemd/logind.conf, definindo a seguinte opção. Conforme escrito, também pode resolver alguns problemas que você pode ter com as soluções da @ terdon.

de man logind.conf:

KillUserProcesses=

Adota um argumento booleano. Configura se os processos de um usuário devem ser eliminados quando o usuário efetua logout. Se verdadeiro, a unidade de escopo correspondente à sessão e todos os processos dentro desse escopo serão encerrados. Se falso, o escopo é "abandonado", consulte systemd.scope (5) e os processos não são eliminados. O padrão é "yes", mas veja as opções KillOnlyUsers=e KillExcludeUsers=abaixo.

Além dos processos de sessão, o processo do usuário pode ser executado na unidade de gerenciador de usuários usuário @ .service. Dependendo das configurações remanescentes, isso pode permitir que os usuários executem processos independentemente de suas sessões de logon. Veja a descrição de enable-lingerem loginctl(1).

Observe que a configuração KillUserProcesses=yesinterromperá ferramentas como screen(1) e tmux(1), a menos que sejam movidas para fora do escopo da sessão. Veja o exemplo em systemd-run(1).

Leia a resposta vinculada para saber mais.

isopor mosca
fonte
11
Isso simplesmente envia o processo para o plano de fundo. O OP deseja desconectar-se de uma sessão ssh remota e continuar com o processo. Isso não ajudará nessa situação, sair da sessão remota interromperá o comando, mesmo que esteja em segundo plano.
terdon
@terdon você verificou se o meu exemplo funciona? Eu verifiquei e funciona para alguns comandos, como escrevi na minha resposta.
styrofoam fly
Sim, verifiquei e sim, vi que algumas vezes o comando continua. No entanto, vi muitas vezes que o comando para, a menos que você possa explicar exatamente quais comandos continuam ou fornecer uma maneira de saber com antecedência se continuará ou não, isso não é muito útil. Na verdade, o exemplo específico que você deu falhou em um teste que acabei de executar, conectando do meu Arch a um sistema Ubuntu remoto.
terdon
@terdon engraçado, eu verifiquei isso no ArchLinux local conectando ao PLD remoto. A única regra que funciona o tempo todo é "o programa usa isatty()e sai se não estiver?"
styrofoam fly
Isso pode merecer sua própria pergunta. Sei que sempre precisava de nohup e, em algum momento, algo mudou e às vezes não. Não consigo ver como a isatty poderia ser isso, se você sair do shell pai, isso também deve matar a criança. Mas sim, às vezes não. Eu estou supondo que deve ser configurável de alguma forma.
terdon