如何在关闭 putty 时保持 python 脚本运行

如何在关闭 putty 时保持 python 脚本运行

我即将在 VPS 上的 Ubuntu 上运行 python 脚本。这是机器学习训练过程,因此需要大量时间进行训练。我怎样才能关闭腻子而不停止该过程。

答案1

您有两个主要选择:

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

    nohup pythonScript.py
    

    请注意,命令的标准输出将附加到名为的文件中,nohup.out除非您重定向它 ( nohup pythonScript.py > outfile)。

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

    tmux 
    pythonScript.py
    

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

答案2

screen适用于所有 Linux 发行版的工具支持此功能。

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

使用方法:

$ screen

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

要查看脚本的运行情况,您可以调用screen -r.这会将您的终端重新连接到 shell,并使用您在后台运行的 Python 脚本。

UPD:正如 Fox 提到的,屏幕与 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

答案3

&大多数进程可以通过重定向其 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=

除了会话进程之外,用户进程还可以在用户管理器单元下运行[电子邮件受保护]。根据延迟设置,这可能允许用户独立于其登录会话运行进程。参见(1)enable-linger中的描述。loginctl

请注意,设置将破坏(1) 和(1)KillUserProcesses=yes等工具,除非将它们移出会话范围。参见(1)中的示例。screentmuxsystemd-run

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

相关内容