在 Ubuntu 上让 Python 程序在后台持久运行有多种方案,从简单到复杂,适用于不同的场景。我将为您详细介绍三种最主流的方案,并提供完整的代码和设置步骤。

 

方案概览

 

  1. nohup & &:最简单快捷的方法,适合临时性的、一次性的后台任务。

  2. tmux / screen:功能强大的终端复用工具,适合需要在后台运行但又可能需要随时回去查看、交互的程序。

  3. systemd:最专业、最可靠的方法,是现代 Ubuntu 系统的标准。适合需要开机自启、进程守护(失败后自动重启)的长期服务。

强烈推荐方案三 (systemd) 用于任何正式的或长期的应用。


 

准备工作:一个示例 Python 程序

 

为了演示,我们先创建一个简单的 Python 程序。假设这是一个 web 应用,会持续监听一个端口。

  1. 创建项目目录

    Bash

  2. 创建 Python 脚本

    创建一个名为 my_app.py 的文件:

    Bash

    在文件中粘贴以下代码。这是一个每秒打印一次时间并将其写入日志文件的简单脚本:

    Python

    Ctrl+X,然后按 YEnter 保存并退出。

现在,让我们用三种不同的方法来让这个 my_app.py 在后台运行。


 

方案一:使用 nohup&

 

这是最直接的方法,nohup (no hang up) 命令可以让程序在您退出终端后继续运行,& 符号则让命令立即在后台执行。

 

优点

 

  • 无需任何配置,命令简单。

  • 适用于快速、临时的任务。

 

缺点

 

  • 程序如果崩溃不会自动重启。

  • 服务器重启后程序不会自动运行。

  • 管理(停止、重启)不方便。

 

设置步骤

 

  1. 运行命令

    在您的项目目录 (my_project) 中,执行以下命令:

    Bash

  2. 查看输出

    • 执行后,终端会显示一个进程ID(PID),例如 [1] 12345

    • 所有的标准输出(print 语句的输出)都会被重定向到一个名为 nohup.out 的文件中。你可以用 tail -f nohup.out 来实时查看。

    • 我们代码中定义的 app.log 也会正常生成和写入。

  3. 如何停止程序

    您需要先找到程序的进程ID (PID),然后“杀死”它。

    Bash


 

方案二:使用 tmux

 

tmux 是一个终端复用器,它允许您创建可以“分离”(detach) 和“重连”(attach) 的会话。程序实际上是在 tmux 会话中运行,即使您关闭了SSH或终端,会话依然在后台存在。

 

优点

 

  • 可以随时重新连接到程序运行的终端,查看实时输出并进行交互。

  • nohup 更易于管理。

 

缺点

 

  • 程序崩溃不会自动重启。

  • 服务器重启后程序不会自动运行。

  • 需要先安装 tmux

 

设置步骤

 

  1. 安装 tmux

    Bash

  2. 创建新的 tmux 会话

    给你的会话起一个有意义的名字,比如 my_app_session。

    Bash

    这会打开一个全新的终端窗口,它实际上是在 tmux 服务中。

  3. 在 tmux 会话中运行程序

    在这个新的窗口中,像平常一样运行你的脚本:

    Bash

    你会看到你的程序开始打印输出。

  4. 分离会话

    现在,你想让它在后台运行。按组合键 Ctrl+b,然后松开,再按 d 键。你会回到原来的终端,并看到 [detached (from session my_app_session)] 的提示。你的程序现在已经在后台的 tmux 会话中持续运行了。

  5. 如何管理

    • 查看所有会话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. 编写服务文件内容

将以下内容粘贴到文件中。请务必根据你的实际情况修改 UserWorkingDirectoryExecStart 的路径。

Ini, TOML

  • Description: 服务的描述。

  • User/Group: 非常重要,指定运行脚本的用户和组。用你的 Linux 用户名替换 your_useryour_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 / screensystemd
易用性非常简单简单中等 (需一次性配置)
开机自启
进程守护 (自动重启)
后台交互否 (通过日志查看)
日志管理手动 (重定向到文件)在会话窗口中自动集成到系统日志
标准化管理否 (手动 ps/kill)部分 (tmux命令)是 (systemctl)
推荐场景快速、一次性任务开发、调试、需交互的任务生产环境、长期服务

最终建议:花一点时间学习并使用 systemd。它的一次性配置投入,会换来后续极大的稳定性和便利性,是部署任何严肃应用的正确方式。


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部