Service文件

服务文件是Systemd用于控制和管理系统服务的一种方式。服务文件通常位于/etc/systemd/system/usr/lib/systemd/system目录下,并且其文件扩展名为.service。下面我将展示一个基本的服务文件模板,并对其组成部分进行解释:

[Unit]
Description=My Sample Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/mydaemon
Restart=on-failure

[Install]
WantedBy=multi-user.target
  1. [Unit] 部分:这个部分包含了服务的描述和依赖关系。
    • Description: 这是对服务的简单描述。
    • After: 这是一个定义了服务启动顺序的选项。在本例中,我们的服务将在网络目标(network.target)之后启动,这意味着我们的服务需要网络正常运行。
  2. [Service] 部分:这个部分描述了服务的运行参数。
    • Type: 这个选项定义了服务的启动类型。在本例中,我们选择了simple,这意味着我们的进程将会在ExecStart指定的命令后台运行,并且这个命令将会立即返回,而不需要等待。
    • ExecStart: 这个选项指定了启动服务时要运行的命令。在本例中,我们启动了一个名为mydaemon的程序。
    • Restart: 这个选项指定了在服务出现故障时是否自动重启。在本例中,我们选择了on-failure,这意味着只有当服务因非正常原因退出(例如,进程崩溃或者被杀死)时,服务才会被自动重启。
  3. [Install] 部分:这个部分定义了服务如何被"安装",即如何被关联到某个目标。
    • WantedBy: 这个选项定义了服务应被哪个目标需要。在本例中,我们选择了multi-user.target,这意味着在多用户模式下,我们的服务将被启动。

注意,以上只是基本模板。根据服务的具体需求,可能需要更复杂的配置。例如,你可能需要定义更多的依赖关系,或者设置特定的用户或组来运行服务,等等。你可以在man systemd.service中查看更多关于服务文件的选项和配置信息。

创建或修改了服务文件后,需要运行systemctl daemon-reload命令,让Systemd重新加载配置。然后,你可以使用systemctl startsystemctl stopsystemctl restartsystemctl status等命令来控制服务。如果你想在系统启动时自动启动服务,还可以使用systemctl enable命令。

服务文件的配置选项非常多,下面是一些常见的参数:

  1. [Unit] 部分:

    • Description: 服务的简要描述。
    • Documentation: 服务的文档链接,可以是man页面或者http链接。
    • After, Before: 用于定义服务启动的顺序。
    • Requires, Wants: 定义服务启动的依赖关系。Requires定义了强依赖,如果依赖的服务未启动,当前服务就不会启动;Wants定义了弱依赖,如果依赖的服务未启动,当前服务仍然会尝试启动。
    • Conflicts: 指定与当前服务冲突的服务,如果指定的服务正在运行,那么当前服务将无法启动。
    • ConditionPathExists, ConditionPathIsDirectory, ConditionFileNotEmpty, ConditionDirectoryNotEmpty, ConditionPathIsSymbolicLink, ConditionPathIsMountPoint, ConditionPathIsReadWrite: 这些条件选项允许在各种文件或目录条件成立时启动服务。
    • ConditionKernelCommandLine, ConditionArchitecture, ConditionVirtualization, ConditionSecurity, ConditionCapability, ConditionACPower, ConditionNeedsUpdate, ConditionFirstBoot, ConditionPathExistsGlob: 这些条件选项允许在各种系统和环境条件成立时启动服务。
    • DefaultDependencies: 设置是否为服务自动生成默认依赖关系。
    • RequiresMountsFor: 指定服务所需的挂载点.
    • Requires: 列出在启动此服务之前需要启动的其他服务或套接字。
    • Wants: 列出在启动此服务之前最好启动的其他服务,但即使这些服务没有启动,此服务也可以运行。
    • After: 指定此服务应在哪些服务之后启动。
  2. [Service] 部分:

    • Type: 定义服务的类型。主要有以下几种类型:

      • simple: 默认值,主进程会立即启动并运行。

      • forking: 主进程会启动一个子进程然后自己退出。

      • oneshot: 主进程会运行,完成任务后退出。通常用于一次性任务。

      • notify: 主进程会启动并通知systemd何时其实际上已经完成了启动过程。

      • idle: 与simple类型类似,但只有在其他任务都完成后才会启动服务。

    • ExecStart: 定义启动服务时要执行的命令。

    • ExecStop: 定义停止服务时要执行的命令。

    • ExecReload: 定义重新加载服务配置时要执行的命令。

    • Restart: 定义服务何时自动重启。主要有以下几种选项:

      • no: 默认值,不自动重启。
      • on-success: 当服务进程正常结束时重启。
      • on-failure: 当服务进程异常结束时重启。
      • on-abnormal: 在进程超时、被信号杀死或者核心转储时重启。
      • on-abort: 在进程由于某些原因被系统杀死时重启。
      • always: 无论何种情况都重启。
    • User, Group: 指定运行服务的用户和组。

    • Environment, EnvironmentFile: 定义环境变量。

    • WorkingDirectory: 指定服务启动时的工作目录。

    • Nice: 设置服务的优先级。这个值从 -20(最高优先级)到 19(最低优先级)。

    • LimitNOFILE: 设置打开的文件描述符的最大数量。

    • LimitNPROC: 设置进程可以使用的最大数量。

    • StandardOutput, StandardError: 这些选项用于控制标准输出和标准错误的处理方式。可以设置为 inherit(默认值,使用系统默认设置),null(丢弃输出),tty(输出到tty,如果有的话),journal(输出到系统日志),syslog(输出到syslog),kmsg(输出到内核消息缓冲区),或者 file:path(输出到指定的文件)。

    • TimeoutStartSec, TimeoutStopSec: 这些选项用于设置服务启动和停止的超时时间。

    • ExecStartPre, ExecStartPost: 这些选项指定在ExecStart命令执行前后运行的命令。例如,可以使用ExecStartPre来检查配置文件的有效性或创建必要的临时文件。

    • OOMScoreAdjust: 调整服务进程的OOM(Out Of Memory,内存不足)得分。这个值的范围是-1000(永远不被杀死)到1000(首先被杀死)。默认值是0。

    • LimitCPU, LimitFSIZE, LimitDATA, LimitSTACK, LimitCORE, LimitRSS, LimitNPROC, LimitNOFILE, LimitAS, LimitLOCKS, LimitSIGPENDING, LimitMSGQUEUE, LimitNICE, LimitRTPRIO, LimitRTTIME: 这些选项用于限制服务进程可以使用的各种资源的数量或大小。

    • IOSchedulingClass, IOSchedulingPriority, CPUSchedulingPolicy, CPUSchedulingPriority, CPUSchedulingResetOnFork, CPUAffinity: 这些选项用于控制服务进程的I/O和CPU调度。

    • ProtectSystem, ProtectHome, PrivateTmp, PrivateDevices, PrivateNetwork, InaccessibleDirectories, ReadOnlyDirectories, ReadWriteDirectories: 这些选项用于提高服务进程的安全性,通过限制进程访问文件系统、设备、网络等资源。

  3. [Install] 部分:

    • WantedBy, RequiredBy: 定义服务安装的目标。
    • Also: 定义与此服务一起安装的其他单位。
    • Alias: 定义服务的别名。

[Socket] 部分(如果服务使用socket激活):

  • ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO, ListenSpecial, ListenNetlink, ListenMessageQueue: 这些选项用于指定服务应监听的各种类型的socket。
  • SocketUser, SocketGroup, SocketMode: 这些选项用于设置socket的所有者、组和权限。
  • Accept: 这个选项用于指定是否应为每个连接创建一个新的服务实例。

[Device] 部分(如果服务需要访问特定设备):

  • DeviceAllow, DevicePolicy: 这些选项用于控制服务进程访问设备的权限。

这些选项的详细说明可以在 man systemd.execman systemd.resource-controlman systemd.socketman systemd.device 等手册页中找到。

在Systemd的服务单元文件中,你还可以使用以下部分以及相关选项:

  1. [Timer] 部分:如果你的服务需要定时运行,你可以使用这个部分来设置定时器。
    • OnActiveSec, OnBootSec, OnStartupSec, OnUnitActiveSec, OnUnitInactiveSec: 这些选项用于设置定时器在特定的时间点激活。
    • OnCalendar: 这个选项用于设置定时器在某个日历时间激活,比如"星期一至星期五的上午9点"。
    • AccuracySec: 这个选项用于设置定时器的准确度。如果设置为较大的值,定时器的触发时间可能会有所偏差,但可以减少系统唤醒的频率,从而节省能源。
    • Persistent: 这个选项用于指定是否在系统重启后保持定时器的状态。
  2. [Path] 部分:如果你的服务需要在文件或目录发生变化时运行,你可以使用这个部分来设置路径监视器。
    • PathExists, PathExistsGlob, PathChanged, PathModified, DirectoryNotEmpty: 这些选项用于设置触发服务的文件或目录变化类型。
  3. [Slice] 部分:如果你的服务需要在特定的cgroup切片中运行,你可以使用这个部分来设置切片。
    • MemoryLimit, CPUShares, BlockIOWeight: 这些选项用于设置切片的资源限制。
  4. [Automount] 部分:如果你的服务需要在文件系统被自动挂载时运行,你可以使用这个部分来设置自动挂载点。
    • Where: 这个选项用于指定自动挂载点的路径。
    • DirectoryMode: 这个选项用于设置自动挂载点的权限。

这些选项的详细说明可以在 man systemd.timerman systemd.pathman systemd.sliceman systemd.automount 等手册页中找到。

[Timer][Socket]部分实际上是在独立的.timer.socket单元文件中定义的,而不是在.service单元文件中。它们通常用于启动.service单元。

  • .timer单元用于定时启动服务。例如,你可以创建一个.timer单元来定时运行一个备份服务。
  • .socket单元用于基于socket激活的服务。例如,你可以创建一个.socket单元来监听一个特定的端口,并在有连接到达时启动服务。

这些.timer.socket单元需要与一个.service单元关联,通常它们的名字是相同的。例如,foo.timer会启动foo.servicebar.socket会启动bar.service

虽然这些单元类型有不同的用途和配置选项,但它们的基本结构是相同的,包括[Unit]部分和[Install]部分。在[Unit]部分,你可以设置单元的描述和依赖关系;在[Install]部分,你可以设置单元的安装目标。

Categories: services

邢宇宇

我是一名热情的云原生架构师和Java开发者,专注于构建可扩展的大数据解决方案。我的职业旅程始于对代码的热爱和创新技术的追求。我拥有在云计算和大数据领域深厚的技术背景,这使我能够设计和实现高效、稳健的系统。 我擅长使用Java来开发高性能的应用程序,同时也深入研究了如何利用云服务来优化数据处理过程。我热衷于探索新技术,如容器化、微服务架构和自动化,这些都是当今构建和部署现代软件解决方案的关键元素。 在我的博客中,我分享我的专业知识和行业见解,探讨最佳实践,以及如何克服在云原生生态系统中遇到的挑战。我相信通过共享和协作,我们可以推动技术的发展,创造出更好的解决方案来解决复杂问题。欢迎加入我的技术之旅,与我一起深入云原生的世界!

0 Comments

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注