Python中的背景流程

我们将介绍如何将Python脚本作为一个背景进程在后台运行。我们还将介绍Python中的pythonw

Python中的后台进程

在自动化和数据科学的世界里,我们已经发展到这样的水平,我们可以很容易地将我们的日常任务自动化,它们可以在后台处理,甚至不需要更新我们(除非我们通过编程让它更新我们)。

本文将讲授如何创建一个脚本,并将其作为后台进程运行。

后台进程只运行一次,之后,当我们启动计算机时,它们就会被自动处理,而当我们关闭计算机时,它们就会停止。

我们也可以通过进入任务管理器或使用Python命令使用其ID杀死进程来停止背景进程。

Python在Windows中的后台进程

有两种不同的方法可以将 Python 脚本作为后台进程运行;一种方法是使用pythonw ,它被用来在 Windows 中作为后台进程运行 Python 脚本。

我们将使用pythonw 将我们的 Python 脚本作为后台进程运行。Pythonw 是用来不使用终端窗口运行 Python 脚本的。

在不使用终端窗口的情况下运行任何 Python 脚本的语法如下。

# python
pythonw backgroundprocess.py

我们可以在上述命令中用我们想作为后台进程运行的文件名代替backgroundprocess.py

在Linux或Mac中使用Python的后台进程

要在Linux或Mac上将Python脚本作为后台进程运行,我们在命令的末尾使用& 操作符,这将使其作为后台进程运行。

在Linux或Mac上将任何Python脚本作为后台进程运行的语法如下。

# python
python backgroundprocess.py &

我们可以在上面的命令中用我们想作为后台进程运行的文件名代替backgroundprocess.py

一旦我们的脚本作为后台进程运行,我们就可以随时检查进程ID来停止后台进程。我们可以在Windows中使用以下命令来杀死我们刚刚启动的进程。

# python
kill -9 {{process id}}

如果我们想在Linux或Mac设备上杀死这个进程,我们可以运行以下命令。

# python
kill -9 {{process id}} &

在上述命令中,-9 表示我们要尽快杀死该进程。因此,使用这个命令将杀死我们将在大括号内提供的ID的进程。

现在,如果我们创建了一个重要的脚本,我们想检查它是如何工作的,并获得关于我们作为后台进程运行的脚本的更新信息,我们可以使用简单的命令将该脚本的输出记录在另一个文件中。

记录后台进程的输出的命令如下所示。

# python
pythonw backgroundprocess.py > backgroundlog

如果我们想在Linux或Mac设备中记录后台进程的输出,我们可以使用下面的命令。

# python
python backgroundprocess.py > backgroundlog &

需要注意的一件事是,我们的后台进程产生的输出将首先保存在缓冲内存中,直到后台进程停止。因此,我们只有在停止进程后,才能从我们的后台进程中获得输出的日志或冲刷。

但是,如果我们不能停止后台进程,因为它可能有丢失一些数据的风险,怎么办?有另一种方法可以直接将输出记录到文件中,而不需要先保存在缓冲存储器中。

我们可以使用下面的命令。

# python
pythonw -u backgroundprocess.py > backgroundlog

如果我们想直接将输出记录在文件中,我们可以在Linux或Mac设备上使用这个命令,如下图所示。

# python
python -u backgroundprocess.py > backgroundlog &

现在,上述命令将直接把输出添加到我们的backgroundlog 文件中。但是我们仍然要保持终端打开以获得输出。

如果我们在后台进程完成之前关闭终端,所有的进程将被停止。所有我们正在运行的进程都将被挂起。

Python总是有各种问题的解决方案。还有一个被称为nohup 的命令。

这个命令可以确保我们的后台进程不受任何干扰地完成。

即使我们关闭了父终端,它仍然会确保我们的后台进程在工作。使用nohup 命令的语法如下所示。

# python
nohup python -u backgroundprocess.py

上面的例子表明,我们忘记了将输出记录在另一个文件中,以便在需要时进行检查。我们没有忘记,在我们的后台进程运行时,nohup 命令会自动生成一个日志并存储到一个文件中,以查看所有的记录。

nohup 命令将把所有的日志存储到nohup.out 文件中。如果我们想杀死这个进程,我们可以很容易地使用我们上面使用的kill 命令来杀死这个进程。

但是,如果我们不记得我们要删除的进程的ID,我们可以使用另一个命令来获取我们作为后台进程运行的文件的名称。并找到进程的ID,使用kill 命令来杀死这个进程。

这个命令的语法如下所示。

# python
ps ax | grep backgroundprocess.py