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.out
menos 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 attach
novamente, 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 attach
novamente e você estará de volta onde começou.
disown
2.screen
byobu
, um wrapper em torno do tmux ou da tela.
A screen
ferramenta, 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 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
screen
não é exatamente compatível com systemd
sua 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 systemd
processos no logout. Algumas versões dos systemd
processos 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-linger
emloginctl
(1).Observe que a configuração
KillUserProcesses=yes
interromperá 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
.