杰瑞科技汇

Linux开机如何自动启动Python脚本?

核心原则:确保健壮性

在设置开机自启动之前,请务必让你的 Python 脚本足够健壮,否则可能导致系统启动卡住或失败,一个好的自启动脚本应该具备以下特点:

Linux开机如何自动启动Python脚本?-图1
(图片来源网络,侵删)
  1. 可执行:脚本本身需要有执行权限 (chmod +x your_script.py)。
  2. Shebang (解释器指令):脚本第一行应指明解释器,#!/usr/bin/env python3
  3. 日志记录:不要只依赖 print(),因为它在后台运行时看不到,将输出重定向到日志文件,>> /var/log/myapp.log 2>&1
  4. 后台运行:脚本应该在后台执行,不能阻塞终端。
  5. 错误处理:脚本内部应有适当的 try...except 错误捕获机制,防止意外崩溃。
  6. 守护进程化:对于长期运行的服务,强烈建议使用 systemd,它能在崩溃后自动重启。

使用 systemd (强烈推荐)

这是现代 Linux 发行版(如 Ubuntu 16.04+, CentOS 7+, Debian 8+)的标准、最强大、最可靠的方法。systemd 是一个系统和服务管理器,功能非常完善。

步骤 1:创建一个 systemd 服务文件

/etc/systemd/system/ 目录下创建一个以 .service 结尾的文件,my-python-app.service

sudo nano /etc/systemd/system/my-python-app.service

步骤 2:编辑服务文件

填入文件中,并根据你的实际情况进行修改。

[Unit]
Description=My Awesome Python Application
After=network.target  # 在网络启动后运行,如果你的应用需要网络
[Service]
# 使用用户的环境变量,并以普通用户身份运行,更安全
# User=your_username
# Group=your_username
# 启动命令
# ExecStart=/usr/bin/python3 /path/to/your/script.py
# 如果你的脚本需要参数,可以这样写:
# ExecStart=/usr/bin/python3 /path/to/your/script.py --arg1 value1
# 如果脚本不是守护进程,会立即退出,systemd 会认为它启动失败。
# 使用 ExecStartPre 确保脚本在后台运行,或者让脚本本身成为守护进程。
# 最简单的方法是让脚本自己处理后台化,或者在命令后加上 `&`。
# 但最佳实践是让脚本本身是一个长期运行的进程(如一个Web服务器)。
# 如果你的脚本执行完就退出了,那么它不适合用 systemd 服务来管理。
# 假设你的脚本是一个长期运行的服务:
ExecStart=/usr/bin/python3 /home/your_username/my_app/server.py
# 工作目录,如果你的脚本依赖相对路径
WorkingDirectory=/home/your_username/my_app
# 重启策略:如果进程意外退出,自动重启
Restart=always
RestartSec=5s  # 重启前等待5秒
# 标准输出和错误重定向到日志文件
StandardOutput=append:/var/log/my-python-app.log
StandardError=append:/var/log/my-python-app.log
# 安全设置:限制文件描述符数量等
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target  # 在多用户命令行模式下启动

关键参数解释:

Linux开机如何自动启动Python脚本?-图2
(图片来源网络,侵删)
  • [Unit]:
    • Description: 服务的描述。
    • After=network.target: 表示此服务在网络服务启动后再启动,如果你的应用不依赖网络,可以去掉这行。
  • [Service]:
    • ExecStart: 启动服务的命令。务必使用绝对路径
    • User / Group: 指定运行服务的用户和用户组。强烈建议不要使用 root,而是创建一个专用的低权限用户。
    • WorkingDirectory: 服务的工作目录。
    • Restart=always: 这是关键!如果服务崩溃或被终止,systemd 会自动重启它。
    • RestartSec: 重启前的延迟时间。
    • StandardOutput / StandardError: 将标准输出和错误重定向到指定文件,方便排查问题。
  • [Install]:
    • WantedBy=multi-user.target: 表示在系统进入“多用户模式”(即命令行模式)时,自动启动此服务。

步骤 3:启用并启动服务

  1. 重新加载 systemd,让它识别新创建的服务文件。

    sudo systemctl daemon-reload
  2. 启动你的服务。

    sudo systemctl start my-python-app.service
  3. 设置开机自启动

    sudo systemctl enable my-python-app.service
  4. 检查服务状态

    Linux开机如何自动启动Python脚本?-图3
    (图片来源网络,侵删)
    sudo systemctl status my-python-app.service

    你会看到服务的运行状态,以及最新的几行日志。

  5. 查看日志

    # 查看实时日志
    journalctl -u my-python-app.service -f
    # 查看所有历史日志
    journalctl -u my-python-app.service
  6. 停止服务

    sudo systemctl stop my-python-app.service
  7. 禁用开机自启动

    sudo systemctl disable my-python-app.service

使用 crontab

cron 是一个基于时间的任务调度器,我们可以利用它的 @reboot 指令,在系统重启后执行一次命令。

适用场景:简单的脚本,不需要复杂的进程管理(如自动重启)。

步骤 1:编辑当前用户的 crontab

crontab -e

步骤 2:添加启动命令

在文件末尾添加以下一行:

@reboot /usr/bin/python3 /path/to/your/script.py >> /var/log/myapp-cron.log 2>&1

参数解释:

  • @reboot: 表示在每次系统重启后执行。
  • /usr/bin/python3: Python 解释器的绝对路径,使用 which python3 可以找到。
  • /path/to/your/script.py: 你的 Python 脚本的绝对路径。
  • >> /var/log/myapp-cron.log 2>&1: 非常重要!将标准输出和标准错误都追加到日志文件中,否则,任何输出都可能通过邮件发送给 root 用户。

步骤 3:保存并退出

保存文件后,cron 会自动加载新的任务,你可以重启电脑测试,或者手动运行 sudo service cron restart 来让任务立即生效。

优点

  • 简单快捷,所有 Linux 系统都支持。
  • 适合执行一次就退出的脚本。

缺点

  • 没有自动重启机制,如果脚本崩溃,它就停止了,不会自动恢复。
  • 日志管理不如 systemd 方便和集中。
  • 如果脚本需要与系统服务(如网络)的启动顺序有依赖关系,@reboot 的执行时机不如 systemdAfter= 精确。

修改 rc.local 文件

这是一种传统的方法,适用于较旧的 Linux 发行版(如 SysVinit 系统),在新版 systemd 系统中,rc.local 默认可能不被执行,需要额外配置。

适用场景:兼容旧系统,或需要在启动的最后阶段执行一些简单的命令。

步骤 1:确保 rc.local 存在并可执行

  1. 检查文件是否存在。
    ls -l /etc/rc.local
  2. 如果文件不存在或没有执行权限,需要创建并赋予执行权限。
    sudo touch /etc/rc.local
    sudo chmod +x /etc/rc.local
  3. systemd 系统中,还需要启用 rc-local.service 服务。
    sudo systemctl enable rc-local.service

步骤 2:编辑 rc.local 文件

sudo nano /etc/rc.local

在文件末尾的 exit 0 之前,添加你的启动命令。

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit with a status of 0" on success
# and "exit with a status of 1" on failure.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# 在这里添加你的命令
# 为了让脚本在后台运行并记录日志,可以这样写:
/usr/bin/python3 /path/to/your/script.py >> /var/log/myapp-rclocal.log 2>&1 &
exit 0

注意

  • 命令末尾的 & 符号是必须的,它让命令在后台执行,否则会阻塞 rc.local 的执行,导致系统启动变慢或卡住。
  • 同样,日志重定向 (>> ... 2>&1) 也是强烈推荐的。

总结与对比

方法 优点 缺点 推荐场景
systemd 功能强大,管理方便,自动重启,日志集中,依赖管理,是现代标准 配置稍复杂,需要较新系统 所有生产环境、服务器、需要高可靠性的应用
crontab 简单,通用性好,无需额外服务 无自动重启,日志管理弱,启动时机不精确 简单的一次性任务,或对可靠性要求不高的脚本
rc.local 传统,兼容性好(旧系统) 启动时机晚,无自动重启,在新系统上需要额外配置 旧系统维护,或在启动最后阶段执行一些辅助脚本

最终建议:

  • 对于任何现代 Linux 系统上的重要服务,请毫不犹豫地选择 systemd,它是目前最完善、最专业的解决方案。
  • 对于一些临时的、简单的、或者你确定不会崩溃的脚本,crontab 是一个快速便捷的选择。
  • 除非你维护的是非常古老的系统,否则尽量避免使用 rc.local
分享:
扫描分享到社交APP
上一篇
下一篇