Answers:
您有两个主要选择:
使用运行命令nohup
。这将使其与会话断开关联,并在断开连接后继续运行:
nohup pythonScript.py
请注意,nohup.out
除非您将其重定向(nohup pythonScript.py > outfile
),否则该命令的stdout将附加到名为的文件中。
使用类似的屏幕多路复用器tmux
。这将使您与远程计算机断开连接,但是,下次连接时,如果tmux attach
再次运行,则会发现自己处于完全相同的会话中。该命令仍将运行(注销后它将继续运行),您将能够看到其stdout和stderr,就像从未注销一样:
tmux
pythonScript.py
启动后,只需关闭PuTTY窗口。然后,第二天再次连接,再次运行tmux attach
,您回到了起点。
disown
2.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
。