关闭腻子时如何保持python脚本运行


19

我即将在VPS的Ubuntu上运行python脚本。这是机器学习培训过程,因此需要大量时间进行培训。我如何在不停止该过程的情况下关闭腻子。


1
结帐nohup
phk

Answers:


36

您有两个主要选择:

  1. 使用运行命令nohup。这将使其与会话断开关联,并在断开连接后继续运行:

    nohup pythonScript.py

    请注意,nohup.out除非您将其重定向(nohup pythonScript.py > outfile),否则该命令的stdout将附加到名为的文件中。

  2. 使用类似的屏幕多路复用器tmux。这将使您与远程计算机断开连接,但是,下次连接时,如果tmux attach再次运行,则会发现自己处于完全相同的会话中。该命令仍将运行(注销后它将继续运行),您将能够看到其stdout和stderr,就像从未注销一样:

    tmux 
    pythonScript.py

    启动后,只需关闭PuTTY窗口。然后,第二天再次连接,再次运行tmux attach,您回到了起点。


4
1&2的替代方法:1. disown2.screen
heemayl '17

也许值得一提的是byobu,围绕tmux或屏幕的包装。
bli

2

screen工具可用于所有Linux发行版,均支持此功能。

要安装它,运行apt-get install screen于基于deb的Linux发行版,或者 dnf install -y screen或者yum install -y screen对于基于RPM的人。

使用方法:

$ screen

启动一个新的shell。在此Shell中,您可以启动Python脚本。然后您可以按Ctrl+ Shift+ A然后D。它将使您的终端与运行脚本的外壳分离。此外,脚本仍在其中运行。

要查看脚本的运行方式,可以致电screen -r。这将使您的终端通过在后台运行的Python脚本重新连接到外壳。

UPD:正如Fox所言,screen无法与systemd配合使用,但是我们可以使用systemd来启动脚本,就像他们在官方示例中所说的那样。

例如,如果您的脚本以开头/usr/bin/myPythonScript,则可以创建Systemd单位文件,如下所示。

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

[Unit]
Description=MyPythonScript

[Service]
ExecStart=/usr/bin/myPythonScript

[Install]
WantedBy=multi-user.target

比,您可以启动此脚本 # systemctl daemon-reload # systemctl start myPythonScript

如果您想让此脚本在系统启动时自动启动-

# systemctl enable myPythonScript

随时可以查看脚本的运行方式

# systemctl status myPythonScript

您可以查看脚本日志的广告

# journalctl -u myPythonScript -e


请注意,在默认配置下screen不能很好地发挥作用systemd。我不知道Ubuntu是否使用systemd,但是您的回答中可能值得一提的行为和解决方法
Fox

1

可以通过重定向其stdout,stderr,stdin(并非始终需要所有描述符来重定向)并使用&控件运算符来欺骗大多数进程。

看到做到这ping example.com 1>/dev/null &一点。

当然,有些程序更复杂,需要@terdon提到的解决方案,但是最好了解和使用最合适的程序。

编辑:如在此答案中所述,杀死systemd注销进程。systemd默认情况下,某些版本的注销进程会终止,而其他版本则不会。可以通过设置以下选项来修改/etc/systemd/logind.conf来更改此行为。如前所述,它也可以解决您在@terdon解决方案中可能遇到的一些问题。

来自man logind.conf

KillUserProcesses=

接受布尔参数。配置用户注销时是否应终止用户的进程。如果为true,则将终止与该会话相对应的作用域单元以及该作用域内的所有进程。如果为false,则范围被“放弃”,请参见systemd.scope(5),并且不会终止进程。默认为“yes”,但看到的选项KillOnlyUsers=KillExcludeUsers=下方。

除了会话进程外,用户进程还可以在用户管理器单元user @ .service下运行。根据延迟设置,这可能允许用户独立于其登录会话运行进程。看到的描述enable-lingerloginctl(1)。

请注意,除非将其移出会话范围,否则设置KillUserProcesses=yes将破坏工具screen(1)和tmux(1)。参见systemd-run(1)中的示例。

阅读链接的答案以了解更多信息。


1
这只是将过程发送到后台。OP希望能够与远程ssh会话断开连接并使该过程继续。在这种情况下这无济于事,即使退出远程会话,该命令也会在后台停止。
terdon

@terdon您是否检查过我的示例是否有效?正如我在答案中所写的那样,我已经检查了它并适用于某些命令。
发泡胶飞

是的,我检查了,是的,我看到有时命令会继续。但是,我经常看到该命令停止运行,因此,除非您能确切解释什么命令继续执行,或者提供一种预先知道该命令是否继续的方法,否则该命令就没有太大用处。实际上,您给出的特定示例在我刚从Arch连接到远程Ubuntu系统的测试中失败了。
terdon

@terdon好笑,我已经在连接到远程PLD的本地ArchLinux上进行了检查。始终有效的唯一规则是“程序是否使用isatty(),如果不使用则退出?”
发泡胶飞

这可能值得提出自己的问题。我知道我以前总是需要nohup,然后在某些时候发生了变化,而有时却不需要。我看不出它是怎么回事,如果退出父shell,那也应该杀死孩子。但是,是的,有时候不是。我猜它一定是可以配置的。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.