Linux开机自启配置_systemd服务编写

4次阅读

linux中通过systemd实现开机自启需编写/etc/systemd/system/下.service文件,含unit[install]三段,再执行daemon-reload、start、enable及journalctl调试。

Linux开机自启配置_systemd服务编写

Linux系统中,通过 systemd 编写自定义服务实现开机自启,是现代发行版(如 centos 7+、ubuntu 16.04+、debian 8+)的标准做法。核心在于编写一个符合规范的 .service 文件,并启用它。

一、创建 service 文件

服务文件通常放在 /etc/systemd/system/ 目录下(系统级服务),文件名以 .service 结尾,例如 myapp.service

基本结构包含三个主要区块:[Unit](描述与依赖)、[Service](运行行为)、[Install](启用配置)。

示例:启动一个 Python 脚本(假设脚本路径为 /opt/myapp/app.py):

[Unit] Description=My Custom Application After=network.target  [Service] Type=simple User=myuser WorkingDirectory=/opt/myapp ExecStart=/usr/bin/python3 /opt/myapp/app.py Restart=on-failure RestartSec=5  [Install] WantedBy=multi-user.target

  • Description:服务描述,显示在日志和状态中
  • After:确保网络就绪后再启动(按需调整,如依赖数据库可加 mysql.service
  • Type:常用 simple(默认,启动后即认为服务就绪)或 forking(后台进程)
  • User/Group:指定运行用户,避免 root 权限滥用
  • ExecStart:必须是绝对路径;若含环境变量或 Shell 特性(如 ~、管道),需改用 Type=exec + Shell=true封装为 shell 脚本
  • Restart:建议设置,防止意外退出;on-failure 表示非正常退出才重启
  • WantedBy:决定启用时链接到哪个 target;multi-user.target 对应传统“多用户文本模式”

二、加载并启用服务

编写完成后,需通知 systemd 重新读取配置:

sudo systemctl daemon-reload

测试服务能否手动启动:

sudo systemctl start myapp.service
sudo systemctl status myapp.service(检查是否 active、有无报错)

确认无误后设为开机自启:

sudo systemctl enable myapp.service

该命令会在 /etc/systemd/system/multi-user.target.wants/ 下创建软链接。

三、常见问题与调试技巧

服务无法启动?优先查日志:

sudo journalctl -u myapp.service -n 50 --no-pager(查看最近 50 行)
sudo journalctl -u myapp.service -f(实时跟踪)

  • 权限错误:检查脚本/目录属主、SELinux(RHEL/CentOS)或 AppArmor(Ubuntu)限制
  • 路径错误:所有路径必须写全,不能用 ~ 或相对路径
  • 环境缺失:systemd 默认环境精简,如需特定环境变量,用 Environment=KEY=VALUEEnvironmentFile=/path/to/env
  • 启动太快依赖未就绪:用 After=xxx.service + Requires=xxx.service 显式声明依赖
  • 服务启动即退出:确认 Type 匹配程序行为;交互式程序需加 StandardInput=NULL 等隔离

四、进阶建议

生产环境中建议补充以下配置:

  • LimitNOFILE:限制打开文件数,防资源耗尽
  • MemoryLimitCPUQuota:配合 cgroups 控制资源使用
  • PrivateTmp=yes:为服务提供独立临时目录,增强隔离性
  • ProtectSystem=strictProtectHome=yes:限制对系统目录和用户家目录的写入
  • RuntimeDirectory=xxx 自动创建运行时目录,避免手动建目录和权限问题

不复杂但容易忽略。写完 service 文件,reload、start、enable、journalctl 四步走,多数问题都能定位解决。

text=ZqhQzanResources