我即将在 VPS 上的 Ubuntu 上运行 python 脚本。这是机器学习训练过程,因此需要大量时间进行训练。我怎样才能关闭腻子而不停止该过程。
答案1
您有两个主要选择:
使用 运行命令
nohup
。这会将其与您的会话取消关联,并在您断开连接后让它继续运行:nohup pythonScript.py
请注意,命令的标准输出将附加到名为的文件中,
nohup.out
除非您重定向它 (nohup pythonScript.py > outfile
)。使用屏幕多路复用器,例如
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)中的示例。screen
tmux
systemd-run
阅读链接的答案以了解更多信息。