systemctl服务文件管理指南

[复制链接]
发表于 2025-5-29 08:41:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
systemctl命令概述

systemctl是 Linux 系统中用于管理系统服务的命令,是systemd初始化系统的一部分。它可以用于启动、制止、重启和重新加载服务,查看服务状态以及设置默认启动级别等等,但是如果要使用systemctl命令管理系统服务,前提是为服务创建一个systemctl服务文件。
使用yum/apt下载的服务,默认会天生一个服务管理文件,但是我们通过二进制编译安装的文件则无法通过systemctl进行服务管理,这时,我们须要手动创建一个服务管理文件用来管理该服务。
Linux系统下的软件安装可以阅读这篇文章:Linux系统中的软件管理
systemctl命令

语法:
  1. systemctl [选项] [命令] [服务名称]
复制代码
常用命令


  • systemctl --help:查看帮助手册
  • systemctl start :启动指定的服务
  • systemctl stop :制止指定的服务
  • systemctl  restart :重启指定的服务
  • systemctl status :查看指定服务的状态
  • systemctl enable :设置开机自启动指定的服务
  • systemctl disable :取消某个服务的开机自启动
  • systemctl reload :在不重启服务的情况下,重新加载其设置文件。
  • systemctl mask :注销服务,会制止服务启动,即使使用start命令也无法启动,常用于防止某些服务被意外启动。
  • systemctl unmask :取消对服务的注销状态。
  • systemctl list-units:查看当前系统通过systemctl管理的已启动的服务
  • systemctl list-unit -files:查看当前系统通过systemctl管理的全部的服务
  • systemctl list-dependencies :查看指定服务依赖哪些其他服务
  • systemctl list-dependencies --reverse :向查看哪些服务依赖于指定服务。
  • journalctl -u :查看指定服务的日记
  • systemctl daemon-reload:当服务设置文件有变更(新增、修改)时,须要先执行该命令加载服务设置文件
服务文件概述

在 Linux 系统中,systemd 服务文件(.service 文件)是用于定义和管理系统服务的焦点设置文件。它们控制服务的启动、制止、依赖关系、运行环境等行为,是 systemd 初始化系统实现服务管理的底子。
服务文件所在路径


  • /etc/systemd/system/:用户自定义设置文件存放的目次,加载时优先加载该目次下的
  • /lib/systemd/system/:软件包安装的默认设置
  • /run/systemd/system/:运行时动态天生的设置
查看yum/apt下载时天生的服务文件

以docker举例
安装docker参考这篇文章:Docker安装
  1. [root@master ~]# cat /etc/systemd/system/docker.service
  2. [Unit]
  3. Description=Docker Application Container Engine
  4. Documentation=https://docs.docker.com
  5. After=network.target
  6. [Service]
  7. Type=notify
  8. # the default is not to use systemd for cgroups because the delegate issues still
  9. # exists and systemd currently does not support the cgroup feature set required
  10. # for containers run by docker
  11. ExecStart=/usr/bin/dockerd
  12. ExecReload=/bin/kill -s HUP $MAINPID
  13. # Having non-zero Limit*s causes performance problems due to accounting overhead
  14. # in the kernel. We recommend using cgroups to do container-local accounting.
  15. LimitNOFILE=infinity
  16. LimitNPROC=infinity
  17. LimitCORE=infinity
  18. # Uncomment TasksMax if your systemd version supports it.
  19. # Only systemd 226 and above support this version.
  20. #TasksMax=infinity
  21. TimeoutStartSec=0
  22. # set delegate yes so that systemd does not reset the cgroups of docker containers
  23. Delegate=yes
  24. # kill only the docker process, not all processes in the cgroup
  25. KillMode=process
  26. [Install]
  27. WantedBy=multi-user.target
复制代码
通过该文件可以发现服务设置文件主要分为三个部分,分别是[Unit]、[Service]、[Install]
下面我们会具体说一下这三个部分的作用
服务设置文件的结构

服务设置文件主要分为三个部分,分别是[Unit]、[Service]、[Install]
Unit部分

[Unit]:主要用来定义服务的元数据、描述信息和依赖关系。
其常用主要的设置有下面几个:

  • Description:服务的简短描述
  • Documentation:服务文档的 URL 或路径
  • After:指定服务启动的顺序(在哪些服务之后启动)
  • Before:指定服务启动的顺序(在哪些服务之前启动)
示例设置:这是一个尽可能全面的设置
  1. [Unit]
  2. # --- 基础元信息 ---
  3. Description=Advanced Example Service       # 服务描述(必填)
  4. Documentation=man:example(1)               # 文档链接(支持多个,用空格分隔)
  5. Documentation=https://example.com/docs     # 可指定多种类型(man/http/file等)
  6. # --- 依赖关系控制 ---
  7. # 强依赖:依赖服务失败则本服务不启动
  8. Requires=postgresql.service redis.service
  9. # 弱依赖:依赖服务失败不影响本服务启动
  10. Wants=nginx.service
  11. # 绑定依赖:依赖服务停止时,本服务也停止
  12. BindsTo=essential-dependency.service
  13. # 服务组:当本服务停止时,关联服务也会停止
  14. PartOf=service-group.target
  15. # --- 启动顺序 ---
  16. # 确保在 network.target 和 postgresql.service 之后启动
  17. After=network.target postgresql.service
  18. # 确保在 graphical.target 之前启动
  19. Before=graphical.target
  20. # --- 冲突管理 ---
  21. # 禁止与旧版本服务同时运行
  22. Conflicts=legacy-service.service
  23. # --- 失败联动 ---
  24. # 若本服务失败,触发另一个服务启动
  25. OnFailure=fallback-service.service
  26. # --- 条件检查 ---
  27. # 仅当文件存在时才启动
  28. ConditionPathExists=/etc/example/config.conf
  29. # 检查目录是否为空(若目录不存在,条件失败)
  30. ConditionDirectoryNotEmpty=/var/lib/example/data
  31. # 检查系统是否满足最低要求(如内核版本
  32. ConditionKernelVersion>=4.15
  33. # --- 高级依赖 ---
  34. # 共享命名空间(常用于容器间通信)
  35. JoinsNamespaceOf=container-service.service
  36. # 重载信号传递
  37. PropagatesReloadTo=reload-dependent.service
  38. ReloadPropagatedFrom=parent-service.service
  39. # --- 资源关联 ---
  40. # 限制仅在特定 CPU 上运行(需 systemd 247+)
  41. AllowedCPUs=0,2
  42. # 限制内存节点(NUMA 架构)
  43. AllowedMemoryNodes=0-1
  44. # --- 其他 ---
  45. # 允许的服务退出状态码(默认0为成功)
  46. SuccessExitStatus=0 255
  47. # 启动超时(默认无限制)
  48. StartLimitIntervalSec=30s
  49. StartLimitBurst=5
复制代码
Service部分

[Service]:主要用来定义服务的具体行为,如启动方式、启动命令、重启策略、运行环境等。
其常用的主要设置有以下几个

  • Type:服务类型,常见值有:

    • simple(默认):ExecStart 直接启动主进程
    • forking:后台守护进程(如 Apache),需通过 PIDFile 指定 PID 文件
    • oneshot:一次性任务(如系统初始化脚本)
    • notify:通过 sd_notify() 通知 systemd 启动完成
    • dbus:通过 D-Bus 接口启动完成通知

  • ExecStart:启动服务的命令
  • ExecStop:制止服务的命令
  • ExecReload:重载设置的命令
  • Restart:重启策略,如 always、on-failure、on-abort 等
  • RestartSec:重启前的等候时间(秒)
  • TimeoutStartSec:启动超时时间
  • Environment:设置环境变量,如 Environment="FOO=bar"
  • WorkingDirectory:设置工作目次
  • User/Group:指定服务运行的用户和组
  • LimitNOFILE/LimitNPROC:设置文件描述符和进程数限制
Service示例设置:这是一个尽可能全面的设置
  1. [Service]
  2. # ==== 基础运行配置 ====
  3. Type=forking                     # 服务类型: forking/simple/oneshot/notify...
  4. ExecStart=/usr/local/bin/myapp start  # 启动命令(必须用绝对路径)
  5. ExecStop=/usr/local/bin/myapp stop    # 停止命令(可选)
  6. ExecReload=/usr/local/bin/myapp reload # 重载命令(支持自定义信号)
  7. Restart=on-failure              # 重启策略: no/always/on-success/on-abort...
  8. RestartSec=5s                   # 重启前等待时间(默认100ms)
  9. TimeoutStartSec=30s             # 启动超时时间(默认无限制)
  10. TimeoutStopSec=15s              # 停止超时时间
  11. RemainAfterExit=yes             # 进程退出后仍标记为 active(适用于 oneshot)
  12. # ==== 权限控制 ====
  13. User=appuser                    # 运行用户(必须存在)
  14. Group=appgroup                  # 运行组
  15. UMask=0027                      # 文件权限掩码
  16. CapabilityBoundingSet=CAP_NET_BIND_SERVICE # 允许的 Linux 能力
  17. NoNewPrivileges=yes             # 禁止进程提升权限
  18. # ==== 环境配置 ====
  19. Environment="NODE_ENV=production"   # 直接设置环境变量
  20. EnvironmentFile=/etc/myapp/env.conf # 从文件加载环境变量
  21. WorkingDirectory=/var/lib/myapp     # 工作目录(必须存在)
  22. StandardOutput=syslog            # 标准输出目标: syslog/journal/file...
  23. StandardError=inherit            # 错误输出继承自标准输出
  24. SyslogIdentifier=myapp           # 自定义 syslog 标识符
  25. # ==== 资源限制 ====
  26. LimitCPU=10min                   # CPU 时间限制(格式: 秒/min/hour)
  27. LimitNOFILE=65536                # 最大文件描述符数
  28. LimitMEMLOCK=64M                 # 最大锁定内存
  29. MemoryMax=2G                     # 最大内存用量(OOM 触发限制)
  30. CPUQuota=150%                    # CPU 配额(CGroup 控制)
  31. # ==== 进程特性 ====
  32. Nice=-10                         # 进程优先级(-20 最高,19 最低)
  33. IOSchedulingClass=realtime       # I/O 调度类(realtime/best-effort/idle)
  34. CPUSchedulingPolicy=rr           # CPU 调度策略(rr/fifo/batch)
  35. CPUSchedulingPriority=90         # 调度优先级(1-99,仅实时策略)
  36. # ==== 安全沙箱 ====
  37. ProtectSystem=full               # 禁止写入系统目录
  38. ProtectHome=tmpfs                # 隔离 /home /root /run/user
  39. PrivateTmp=yes                   # 使用私有 /tmp 和 /var/tmp
  40. PrivateDevices=yes               # 无法访问物理设备(如 /dev/sda)
  41. ProtectKernelTunables=yes        # 禁止修改内核参数
  42. ProtectControlGroups=yes         # 禁止修改 CGroup 配置
  43. RestrictAddressFamilies=AF_INET AF_UNIX # 允许的 socket 协议簇
  44. RestrictNamespaces=yes           # 禁止创建新命名空间
  45. LockPersonality=yes              # 禁止切换进程 personality
  46. # ==== 信号处理 ====
  47. KillMode=mixed                   # 停止模式: process/control-group/mixed...
  48. KillSignal=SIGTERM               # 首选终止信号
  49. SendSIGHUP=yes                   # 是否发送 SIGHUP 到进程组
  50. FinalKillSignal=SIGKILL          # 最终强制终止信号
  51. WatchdogSec=30s                  # 看门狗检测间隔(需服务定期 ping)
  52. # ==== 高级特性 ====
  53. NotifyAccess=all                 # 支持 sd_notify 状态通知(配合 Type=notify)
  54. ExecStartPre=/path/to/pre-script # 启动前脚本
  55. ExecStartPost=/path/to/post-script # 启动后脚本
  56. Slice=myapp.slice                # 关联自定义 CGroup slice
  57. Delegate=yes                     # 允许服务管理子 CGroup
  58. OOMPolicy=kill                   # OOM 处理策略(continue/stop/kill)
复制代码
Install部分

[Install]:主要是用来定义服务的安装信息,怎样在系统启动时启用
其常用的设置主要有以下几个:

  • WantedBy:指定服务在哪些目标(Target)下启用,常见值为 multi-user.target(多用户模式)
  • RequiredBy:强依赖关系,类似 Requires 的反向设置
  • Alias:服务的别名,可通过别名启动服务
示例设置:尽可能全面的设置
  1. [Install]
  2. # ===== 基础安装配置 =====
  3. WantedBy=multi-user.target          # 关联到标准多用户目标(开机自启)
  4. RequiredBy=critical-services.target # 强依赖目标(必须随该目标启动)
  5. Also=myapp-socket.service           # 关联的其他单元(同时启停)
  6. Alias=legacy-app.service            # 服务别名(兼容旧名称)
  7. # ===== 多实例服务 =====
  8. DefaultInstance=http               # 默认实例名称(用于模板单元)
  9. WantedBy=app-instances.target       # 多实例关联目标
  10. # ===== 反向依赖控制 =====
  11. WantedBy=postgresql.service         # 反向声明:当 postgresql 启用时自动启用本服务
  12. RequiredBy=nginx.service            # 反向强依赖(不推荐,易导致循环)
  13. # ===== 高级生命周期 =====
  14. StopWhenUnneeded=yes                # 当无其他依赖时自动停止(需配合 RefuseManualStart)
  15. RefuseManualStart=no                # 是否允许手动启动(默认 no)
  16. RefuseManualStop=no                 # 是否允许手动停止(默认 no)
  17. # ===== 触发式安装 =====
  18. Upholds=myapp-monitor.timer         # 当 timer 激活时自动维护本服务状态
复制代码
编写第一个systemd文件

安装tomcat

tomcat安装参考这篇文章:tomcat使用
编写systemd文件
  1. [root@master ~]# cat /etc/systemd/system/tomcat.service
  2. [Unit]
  3. Description=Tomcat Service
  4. Documentation=https://www.cnblogs.com/huangSir-devops/p/18808870
  5. After=syslog.target network.target
  6. [Service]
  7. Type=forking
  8. # jdk安装的位置
  9. Environment=JAVA_HOME=/root/jdk
  10. Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
  11. # tomcat安装的位置
  12. Environment=CATALINA_HOME=/root/tomcat
  13. Environment=CATALINA_BASE=/root/tomcat
  14. Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
  15. # 启动命令
  16. ExecStart=/root/tomcat/bin/startup.sh
  17. # 停止命令
  18. ExecStop=/root/tomcat/bin/shutdown.sh -wait 30
  19. User=root
  20. Group=root
  21. UMask=0007
  22. RestartSec=10
  23. Restart=always
  24. [Install]
  25. WantedBy=multi-user.target
复制代码
验证启动Tomcat

创建pid文件目次
  1. [root@master ~]# mkdir -p /opt/tomcat/temp/
复制代码
重新加载systemd文件
  1. [root@master ~]# systemctl daemon-reload
复制代码
启动Tomcat
  1. [root@master ~]# systemctl start tomcat
复制代码
检查启动状态,发现处于running状态
  1. [root@master ~]# systemctl status tomcat.service
  2. ● tomcat.service - Tomcat Service
  3.      Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; preset: enabled)
  4.      Active: active (running) since Wed 2025-05-28 14:53:51 CST; 3min 18s ago
  5.        Docs: https://www.cnblogs.com/huangSir-devops/p/18808870
  6.     Process: 3561014 ExecStart=/root/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
  7.    Main PID: 3561021 (java)
  8.       Tasks: 63 (limit: 76938)
  9.      Memory: 150.3M
  10.      CGroup: /system.slice/tomcat.service
  11.              └─3561021 /root/jdk/bin/java -Djava.util.logging.config.file=/root/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManage>
  12. May 28 14:53:51 master systemd[1]: Starting tomcat.service - Tomcat Service...
复制代码
检查端口是否启动成功
  1. # 检查端口
  2. [root@master ~]# ss -lntup | grep 8080
  3. tcp   LISTEN 0      100                                 *:8080             *:*    users:(("java",pid=3561021,fd=55))
  4. # 检查进程
  5. [root@master ~]# ps -ef | grep java
  6. root     3561021       1  1 14:53 ?        00:00:03 /root/jdk/bin/java -Djava.util.logging.config.file=/root/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Xms512M -Xmx1024M -server -XX:+UseParallelGC -Dignore.endorsed.dirs= -classpath /root/tomcat/bin/bootstrap.jar:/root/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/root/tomcat -Dcatalina.home=/root/tomcat -Djava.io.tmpdir=/root/tomcat/temp org.apache.catalina.startup.Bootstrap start
  7. root     3565153 2589339  0 14:58 pts/0    00:00:00 grep java
复制代码
验证制止和重启

验证重启
  1. [root@master ~]# systemctl restart tomcat
  2. [root@master ~]# systemctl status tomcat
  3. ● tomcat.service - Tomcat Service
  4.      Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; preset: enabled)
  5.      Active: active (running) since Wed 2025-05-28 15:04:06 CST; 3s ago
  6.        Docs: https://www.cnblogs.com/huangSir-devops/p/18808870
  7.     Process: 3570268 ExecStart=/root/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
  8.    Main PID: 3570275 (java)
  9.       Tasks: 63 (limit: 76938)
  10.      Memory: 157.0M
  11.      CGroup: /system.slice/tomcat.service
  12.              └─3570275 /root/jdk/bin/java -Djava.util.logging.config.file=/root/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManage>
复制代码
验证制止
  1. [root@master ~]# systemctl stop tomcat
  2. [root@master ~]# systemctl status tomcat
  3. ○ tomcat.service - Tomcat Service
  4.      Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; preset: enabled)
  5.      Active: inactive (dead)
  6.        Docs: https://www.cnblogs.com/huangSir-devops/p/18808870
  7. May 28 15:04:06 master systemd[1]: tomcat.service: Deactivated successfully.
  8. May 28 15:04:06 master systemd[1]: Stopped tomcat.service - Tomcat Service.
  9. May 28 15:04:06 master systemd[1]: Starting tomcat.service - Tomcat Service...
  10. May 28 15:04:06 master startup.sh[3570268]: Tomcat started.
  11. May 28 15:04:06 master systemd[1]: Started tomcat.service - Tomcat Service.
  12. May 28 15:04:40 master systemd[1]: Stopping tomcat.service - Tomcat Service...
  13. May 28 15:04:40 master shutdown.sh[3570785]: usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] [ -generateCode [ {pathname} ] ] [ -useGener>
  14. May 28 15:04:41 master shutdown.sh[3570776]: Tomcat stopped.
  15. May 28 15:04:41 master systemd[1]: tomcat.service: Deactivated successfully.
  16. May 28 15:04:41 master systemd[1]: Stopped tomcat.service - Tomcat Service.
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-6-19 20:02 , Processed in 0.059371 second(s), 25 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )

快速回复 返回顶部 返回列表