Ubuntu 18.04 systemd 服务配置:3步创建自定义开机服务,支持sudo权限
Ubuntu 18.04 系统服务配置实战从零构建 systemd 守护进程在 Linux 系统管理中服务Service作为后台运行的守护进程承担着诸多关键任务。Ubuntu 18.04 作为首个默认采用 systemd 的 LTS 版本彻底改变了传统的服务管理方式。本文将深入探讨如何利用 systemd 的强大功能创建可靠的自定义系统服务。1. systemd 服务基础架构systemd 作为现代化的初始化系统已经取代了传统的 SysV init 成为主流 Linux 发行版的标准配置。理解其核心架构是创建自定义服务的前提。**单元文件Unit File**是 systemd 的核心配置文件采用 INI 风格的语法结构。服务单元文件通常以.service 为后缀存储在以下目录中/lib/systemd/system/系统预装服务的单元文件/etc/systemd/system/管理员自定义服务的单元文件推荐位置一个典型的服务单元文件包含三个主要部分[Unit] DescriptionMy Custom Service Afternetwork.target [Service] Typesimple ExecStart/usr/local/bin/my_service Restarton-failure [Install] WantedBymulti-user.target服务生命周期管理通过 systemctl 命令实现# 重新加载修改后的单元文件 sudo systemctl daemon-reload # 启用服务开机自启 sudo systemctl enable my_service # 立即启动服务 sudo systemctl start my_service # 查看服务状态 sudo systemctl status my_service2. 创建自定义服务实战让我们通过一个实际案例来演示如何创建完整的 systemd 服务。假设我们需要部署一个 Python 应用作为系统服务。2.1 准备可执行脚本首先创建服务主体脚本/usr/local/bin/my_python_app.py#!/usr/bin/env python3 import time import logging from systemd.journal import JournalHandler logger logging.getLogger(my_python_app) logger.addHandler(JournalHandler()) logger.setLevel(logging.INFO) def main(): logger.info(Service starting...) try: while True: # 实际业务逻辑 logger.info(Service is running) time.sleep(10) except KeyboardInterrupt: logger.info(Service stopping...) if __name__ __main__: main()设置可执行权限sudo chmod x /usr/local/bin/my_python_app.py2.2 编写单元文件创建服务定义文件/etc/systemd/system/my_python_app.service[Unit] DescriptionPython Application Service Documentationhttps://example.com/docs Afternetwork.target postgresql.service Requirespostgresql.service [Service] Typesimple Userappuser Groupappgroup WorkingDirectory/var/lib/my_python_app EnvironmentPYTHONUNBUFFERED1 ExecStart/usr/local/bin/my_python_app.py ExecReload/bin/kill -HUP $MAINPID Restarton-failure RestartSec5s TimeoutStopSec30 LimitNOFILE65536 [Install] WantedBymulti-user.target关键参数说明User/Group指定运行服务的专用用户WorkingDirectory设置工作目录Environment配置环境变量Restart定义服务失败时的重启策略LimitNOFILE设置文件描述符限制2.3 服务部署与验证创建专用用户和目录sudo useradd -r -s /bin/false appuser sudo mkdir -p /var/lib/my_python_app sudo chown appuser:appuser /var/lib/my_python_app启用并启动服务sudo systemctl daemon-reload sudo systemctl enable my_python_app sudo systemctl start my_python_app验证服务状态sudo systemctl status my_python_app journalctl -u my_python_app -f3. 高级配置技巧3.1 依赖管理与启动顺序systemd 提供了精细的依赖控制机制[Unit] Requirespostgresql.service redis.service Afterpostgresql.service redis.service Conflictsold_service.service Beforeweb_app.service3.2 资源限制与安全通过 cgroups 实现资源隔离[Service] MemoryLimit512M CPUQuota80% DeviceAllow/dev/ttyUSB0 rw PrivateTmpyes ProtectSystemfull3.3 多命令复合服务使用ExecStartPre和ExecStartPost实现复杂初始化[Service] ExecStartPre/usr/bin/docker pull my_image:latest ExecStart/usr/bin/docker run --name my_app my_image:latest ExecStop/usr/bin/docker stop my_app ExecStopPost/usr/bin/docker rm my_app4. 故障排查与日志分析systemd 提供了强大的日志工具 journalctl# 查看完整服务日志 journalctl -u my_service -b # 实时跟踪日志 journalctl -u my_service -f # 按时间筛选 journalctl -u my_service --since 2024-01-01 --until 2024-01-02 # 按日志级别筛选 journalctl -u my_service -p err常见问题诊断命令# 检查服务依赖关系 systemd-analyze verify my_service.service # 查看服务启动耗时 systemd-analyze critical-chain my_service.service # 检查单元文件语法 systemd-analyze verify /etc/systemd/system/my_service.service对于需要 sudo 权限的服务确保在单元文件中正确配置User和Group字段并考虑使用CapabilityBoundingSet进行精细的权限控制而非直接使用 root 用户。