在 Ubuntu 上让 Python 程序在后台持久运行有多种方案,从简单到复杂,适用于不同的场景。我将为您详细介绍三种最主流的方案,并提供完整的代码和设置步骤。
方案概览
nohup
&&
:最简单快捷的方法,适合临时性的、一次性的后台任务。tmux
/screen
:功能强大的终端复用工具,适合需要在后台运行但又可能需要随时回去查看、交互的程序。systemd
:最专业、最可靠的方法,是现代 Ubuntu 系统的标准。适合需要开机自启、进程守护(失败后自动重启)的长期服务。
强烈推荐方案三 (systemd
) 用于任何正式的或长期的应用。
准备工作:一个示例 Python 程序
为了演示,我们先创建一个简单的 Python 程序。假设这是一个 web 应用,会持续监听一个端口。
创建项目目录
Bash
创建 Python 脚本
创建一个名为 my_app.py 的文件:
Bash
在文件中粘贴以下代码。这是一个每秒打印一次时间并将其写入日志文件的简单脚本:
Python
按
Ctrl+X
,然后按Y
和Enter
保存并退出。
现在,让我们用三种不同的方法来让这个 my_app.py
在后台运行。
方案一:使用 nohup
和 &
这是最直接的方法,nohup
(no hang up) 命令可以让程序在您退出终端后继续运行,&
符号则让命令立即在后台执行。
优点
无需任何配置,命令简单。
适用于快速、临时的任务。
缺点
程序如果崩溃不会自动重启。
服务器重启后程序不会自动运行。
管理(停止、重启)不方便。
设置步骤
运行命令
在您的项目目录 (my_project) 中,执行以下命令:
Bash
查看输出
执行后,终端会显示一个进程ID(PID),例如
[1] 12345
。所有的标准输出(
print
语句的输出)都会被重定向到一个名为nohup.out
的文件中。你可以用tail -f nohup.out
来实时查看。我们代码中定义的
app.log
也会正常生成和写入。
如何停止程序
您需要先找到程序的进程ID (PID),然后“杀死”它。
Bash
方案二:使用 tmux
tmux
是一个终端复用器,它允许您创建可以“分离”(detach) 和“重连”(attach) 的会话。程序实际上是在 tmux
会话中运行,即使您关闭了SSH或终端,会话依然在后台存在。
优点
可以随时重新连接到程序运行的终端,查看实时输出并进行交互。
比
nohup
更易于管理。
缺点
程序崩溃不会自动重启。
服务器重启后程序不会自动运行。
需要先安装
tmux
。
设置步骤
安装 tmux
Bash
创建新的 tmux 会话
给你的会话起一个有意义的名字,比如 my_app_session。
Bash
这会打开一个全新的终端窗口,它实际上是在
tmux
服务中。在 tmux 会话中运行程序
在这个新的窗口中,像平常一样运行你的脚本:
Bash
你会看到你的程序开始打印输出。
分离会话
现在,你想让它在后台运行。按组合键 Ctrl+b,然后松开,再按 d 键。你会回到原来的终端,并看到 [detached (from session my_app_session)] 的提示。你的程序现在已经在后台的 tmux 会话中持续运行了。
如何管理
查看所有会话:
tmux ls
重新连接会话:
tmux attach -t my_app_session
停止程序:连接回会话后,直接按
Ctrl+C
即可。然后可以输入exit
来关闭tmux
窗口并结束会话。直接杀死会话:
tmux kill-session -t my_app_session
方案三:使用 systemd
(专业推荐)
systemd
是 Ubuntu 和其他现代 Linux 发行版的标准系统和服务管理器。将你的程序配置成一个 systemd
服务,是让它在后台长期可靠运行的最佳方式。
优点
开机自启:可以配置服务在系统启动时自动运行。
进程守护:如果程序因任何原因崩溃,
systemd
可以自动重启它。标准化管理:使用
systemctl
命令来启动、停止、重启、查看状态,非常方便。日志集成:自动将程序的输出捕获到系统日志 (
journalctl
) 中,易于查看和管理。高安全性:可以指定程序以哪个用户身份运行,而不是用 root。
设置步骤
1. 准备工作:使用虚拟环境 (推荐)
为了不污染系统全局的 Python 环境,并更好地管理依赖,强烈建议使用虚拟环境。
Bash
2. 创建 systemd
服务文件
systemd
的服务文件通常放在 /etc/systemd/system/
目录下,以 .service
结尾。
Bash
3. 编写服务文件内容
将以下内容粘贴到文件中。请务必根据你的实际情况修改 User
、WorkingDirectory
和 ExecStart
的路径。
Ini, TOML
Description
: 服务的描述。User
/Group
: 非常重要,指定运行脚本的用户和组。用你的 Linux 用户名替换your_user
和your_group
(通常二者同名)。你可以通过id
命令查看。WorkingDirectory
: 脚本的运行目录,确保使用绝对路径。ExecStart
: 核心,启动脚本的命令。这里我们指定了虚拟环境venv
里的 Python 解释器的绝对路径,以确保使用了正确的环境和依赖。Restart=always
: 实现了进程守护,当程序退出时(无论正常还是异常),systemd
都会尝试重启它。WantedBy=multi-user.target
: 表示这个服务应该在系统进入多用户模式时启用。
4. 管理服务
重新加载
systemd
配置:每次修改.service
文件后,都需要执行此命令。Bash
启动你的服务:
Bash
查看服务状态:这是最重要的调试命令,可以查看服务是否在运行、最近的日志等。
Bash
如果一切正常,你会看到
active (running)
的绿色字样。如果出错,这里会显示错误信息。设置开机自启:
Bash
停止服务:
Bash
重启服务:
Bash
查看完整的程序日志:
Bash
总结与建议
特性 | nohup & | tmux / screen | systemd |
---|---|---|---|
易用性 | 非常简单 | 简单 | 中等 (需一次性配置) |
开机自启 | 否 | 否 | 是 |
进程守护 (自动重启) | 否 | 否 | 是 |
后台交互 | 否 | 是 | 否 (通过日志查看) |
日志管理 | 手动 (重定向到文件) | 在会话窗口中 | 自动集成到系统日志 |
标准化管理 | 否 (手动 ps /kill ) | 部分 (tmux命令) | 是 (systemctl ) |
推荐场景 | 快速、一次性任务 | 开发、调试、需交互的任务 | 生产环境、长期服务 |
最终建议:花一点时间学习并使用 systemd
。它的一次性配置投入,会换来后续极大的稳定性和便利性,是部署任何严肃应用的正确方式。
发表评论 取消回复