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.
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.
Respostas:
Você tem duas opções principais:
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).
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.
disown2.screen
byobu, um wrapper em torno do tmux ou da tela.
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
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
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=eKillExcludeUsers=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-lingeremloginctl(1).Observe que a configuração
KillUserProcesses=yesinterromperá ferramentas comoscreen(1) etmux(1), a menos que sejam movidas para fora do escopo da sessão. Veja o exemplo emsystemd-run(1).
Leia a resposta vinculada para saber mais.
isatty()e sai se não estiver?"
nohup.