☰
Linux系统服务开发
2026/10/13 2:58:20 网站建设 项目流程

开机启动python脚本文件方法:
创建一个文件:
/etc/systemd/system/python-test.service

[Unit]Description=My Python ScriptAfter=network.target[Service]# ✅ 关键修改:直接使用虚拟环境中的 python3 绝对路径ExecStart=/home/admin/.venv/bin/python3 /home/admin/py/api1.pyEnvironment="PATH=/home/admin/.venv/bin"WorkingDirectory=/home/admin/py#失败重启策略Restart=on-failureRestartSec=10#运行用户User=adminGroup=admin# 日志输出配置StandardOutput=file:/home/admin/Obsidian/output.logStandardError=file:/home/admin/Obsidian/error.log# 如果脚本依赖特定环境变量,请在此处显式定义,不要依赖 .bashrc# Environment="PATH=/path/to/your/script/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"# Environment="MY_API_KEY=secret_value"[Install]WantedBy=multi-user.target
[Unit]Description=SavePos Flask API ServiceAfter=network.target[Service]User=adminWorkingDirectory=/var/www/html/saveposExecStart=/home/admin/.venv/bin/python3 /var/www/html/savepos/savepos.pyRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.target

在 Linux 系统中,/etc/systemd/system/ 目录是存放‌自定义系统级服务单元文件(Unit Files)‌的标准位置。将服务配置文件放置在此处,可以覆盖 /usr/lib/systemd/system/ 中的默认配置,并允许管理员完全控制服务的启动行为、依赖关系和运行环境。

以下是创建、配置、启动及排查 systemd 服务的完整指南:

  1. 创建服务配置文件

首先,你需要在 /etc/systemd/system/ 目录下创建一个以 .service 结尾的文件。假设我们要创建一个名为 myapp的服务:

bash
sudo nano /etc/systemd/system/myapp.service

一个标准的 Service 文件通常包含以下三个部分:

ini
[Unit]
Description=My Custom Application Service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
User=myuser
Group=mygroup
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/start.sh
ExecStop=/opt/myapp/bin/stop.sh
Restart=on-failure
RestartSec=5s
Environment=“PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin”
Environment=“APP_ENV=production”

安全限制(可选)

ProtectSystem=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

关键字段说明:
[Unit]‌:
Description: 服务的简短描述。
After: 指定启动顺序,表示在网络和日志服务启动后再启动此服务。
[Service]‌:
Type: 进程类型。simple(默认,主进程前台运行)、forking(后台守护进程)、notify(发送就绪信号)。
User/Group: ‌强烈建议‌指定非 root 用户运行,以提高安全性。
ExecStart: ‌必须项‌,启动服务的绝对路径命令。
Restart: 退出后的重启策略。on-failure(非正常退出时重启)、always(总是重启)、no(不重启)。
Environment: 设置环境变量,避免依赖全局 profile。
[Install]‌:
WantedBy: 指定服务属于哪个目标组。multi-user.target 相当于传统的多用户命令行模式(类似 runlevel 3)。如果是图形界面应用且需要显示,可能需要 graphical.target 并配置 Display 环境变量。
2. 加载并启动服务

修改或新建服务文件后,必须通知 systemd 重新加载配置:

bash

1. 重载守护进程配置

sudo systemctl daemon-reload

2. 启用开机自启(创建符号链接到 wantedby 目录)

sudo systemctl enable myapp.service

3. 立即启动服务

sudo systemctl start myapp.service

  1. 管理服务状态

常用管理命令如下:

bash

查看服务当前状态(运行中、失败、退出等)

sudo systemctl status myapp.service

停止服务

sudo systemctl stop myapp.service

重启服务

sudo systemctl restart myapp.service

禁用开机自启

sudo systemctl disable myapp.service

查看服务是否已启用

systemctl is-enabled myapp.service

  1. 排查启动失败(核心步骤)

如果服务启动失败(状态为 failed),systemctl start 通常只返回通用错误。请按以下步骤精准定位问题:

第一步:查看详细状态
bash
sudo systemctl status myapp.service

关注输出中的:

Active: 行(如 active (running) 或 failed)。
Main PID: 进程ID。
底部的最新日志片段,常包含 Permission denied、No such file 等关键线索。
第二步:查阅完整日志(最关键)

systemd 的标准输出和错误输出都被捕获到 journal 中。使用以下命令查看该服务的专属日志:

bash

查看最近 50 行日志,跳转到末尾,不分页

journalctl -u myapp.service -n 50 --no-pager -e

实时跟踪日志(适合调试启动过程)

journalctl -u myapp.service -f

重点寻找:‌

应用程序自己打印的错误堆栈(Stack Trace)。
Permission denied:检查文件权限或 SELinux/AppArmor 限制。
Address already in use:端口冲突。
Executable not found:ExecStart 路径错误或缺少执行权限 (chmod +x)。
第三步:手动模拟启动

如果日志不明确,尝试以相同用户身份手动执行 ExecStart 命令,以排除 systemd 环境差异:

bash

切换到服务指定的用户

sudo -u myuser -i

进入工作目录

cd /opt/myapp

手动执行启动命令

/opt/myapp/bin/start.sh

如果手动执行也报错,则问题出在脚本本身或依赖环境(如缺少库文件、环境变量缺失),而非 systemd 配置问题。

  1. 常见陷阱与注意事项
    权限问题‌:
    确保 ExecStart 指向的文件具有执行权限 (chmod +x)。
    确保 User 指定的用户对 WorkingDirectory 和相关日志/数据目录有读写权限。
    路径必须绝对‌:
    ExecStart、WorkingDirectory 等字段必须使用绝对路径,不能使用 ~ 或相对路径。
    图形界面服务(GUI)‌:
    如果你试图通过 systemd 启动像 Cursor、VS Code 这样的图形应用,‌系统级服务(/etc/systemd/system/)通常无法直接访问显示服务器(X11/Wayland)‌。
    解决方案‌:使用‌用户级 systemd‌(见下文),或者仅在无头(Headless)模式下运行后端服务。
    环境变量隔离‌:
    systemd 启动的环境非常干净,不会加载 /etc/profile 或 ~/.bashrc。所有必需的环境变量(如 JAVA_HOME, PATH, DB_URL)必须在 .service 文件中通过 Environment= 或 EnvironmentFile= 显式定义。
  2. 进阶:用户级服务(User Service)

对于需要访问用户会话、图形界面或特定用户配置的服务,应使用用户级 systemd,配置文件位于 ~/.config/systemd/user/。

bash

创建用户服务目录

mkdir -p ~/.config/systemd/user/

编辑用户服务文件

nano ~/.config/systemd/user/mygui-app.service

管理命令需加上 --user 参数:

bash
systemctl --user daemon-reload
systemctl --user enable mygui-app.service
systemctl --user start mygui-app.service
journalctl --user -u mygui-app.service -f

总结‌:在 /etc/systemd/system/ 下管理服务时,核心流程是“编写配置 -> daemon-reload -> enable/start -> journalctl 排查”。务必重视日志分析,它是解决启动失败的最直接途径。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询