Answers:
您有两个主要选择:
使用运行命令nohup。这将使其与会话断开关联,并在断开连接后继续运行:
nohup pythonScript.py
请注意,nohup.out除非您将其重定向(nohup pythonScript.py > outfile),否则该命令的stdout将附加到名为的文件中。
使用类似的屏幕多路复用器tmux。这将使您与远程计算机断开连接,但是,下次连接时,如果tmux attach再次运行,则会发现自己处于完全相同的会话中。该命令仍将运行(注销后它将继续运行),您将能够看到其stdout和stderr,就像从未注销一样:
tmux
pythonScript.py
启动后,只需关闭PuTTY窗口。然后,第二天再次连接,再次运行tmux attach,您回到了起点。
disown2.screen
byobu,围绕tmux或屏幕的包装。
该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
可以通过重定向其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-linger在loginctl(1)。请注意,除非将其移出会话范围,否则设置
KillUserProcesses=yes将破坏工具screen(1)和tmux(1)。参见systemd-run(1)中的示例。
阅读链接的答案以了解更多信息。
isatty(),如果不使用则退出?”
nohup。