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
[Unit]部分:这个部分包含了服务的描述和依赖关系。Description: 这是对服务的简单描述。After: 这是一个定义了服务启动顺序的选项。在本例中,我们的服务将在网络目标(network.target)之后启动,这意味着我们的服务需要网络正常运行。
[Service]部分:这个部分描述了服务的运行参数。Type: 这个选项定义了服务的启动类型。在本例中,我们选择了simple,这意味着我们的进程将会在ExecStart指定的命令后台运行,并且这个命令将会立即返回,而不需要等待。ExecStart: 这个选项指定了启动服务时要运行的命令。在本例中,我们启动了一个名为mydaemon的程序。Restart: 这个选项指定了在服务出现故障时是否自动重启。在本例中,我们选择了on-failure,这意味着只有当服务因非正常原因退出(例如,进程崩溃或者被杀死)时,服务才会被自动重启。
[Install]部分:这个部分定义了服务如何被"安装",即如何被关联到某个目标。WantedBy: 这个选项定义了服务应被哪个目标需要。在本例中,我们选择了multi-user.target,这意味着在多用户模式下,我们的服务将被启动。
注意,以上只是基本模板。根据服务的具体需求,可能需要更复杂的配置。例如,你可能需要定义更多的依赖关系,或者设置特定的用户或组来运行服务,等等。你可以在man systemd.service中查看更多关于服务文件的选项和配置信息。
创建或修改了服务文件后,需要运行systemctl daemon-reload命令,让Systemd重新加载配置。然后,你可以使用systemctl start、systemctl stop、systemctl restart、systemctl status等命令来控制服务。如果你想在系统启动时自动启动服务,还可以使用systemctl enable命令。
服务文件的配置选项非常多,下面是一些常见的参数:
-
[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: 指定此服务应在哪些服务之后启动。
-
[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: 这些选项用于提高服务进程的安全性,通过限制进程访问文件系统、设备、网络等资源。
-
-
[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.exec,man systemd.resource-control,man systemd.socket,man systemd.device 等手册页中找到。
在Systemd的服务单元文件中,你还可以使用以下部分以及相关选项:
[Timer]部分:如果你的服务需要定时运行,你可以使用这个部分来设置定时器。OnActiveSec,OnBootSec,OnStartupSec,OnUnitActiveSec,OnUnitInactiveSec: 这些选项用于设置定时器在特定的时间点激活。OnCalendar: 这个选项用于设置定时器在某个日历时间激活,比如"星期一至星期五的上午9点"。AccuracySec: 这个选项用于设置定时器的准确度。如果设置为较大的值,定时器的触发时间可能会有所偏差,但可以减少系统唤醒的频率,从而节省能源。Persistent: 这个选项用于指定是否在系统重启后保持定时器的状态。
[Path]部分:如果你的服务需要在文件或目录发生变化时运行,你可以使用这个部分来设置路径监视器。PathExists,PathExistsGlob,PathChanged,PathModified,DirectoryNotEmpty: 这些选项用于设置触发服务的文件或目录变化类型。
[Slice]部分:如果你的服务需要在特定的cgroup切片中运行,你可以使用这个部分来设置切片。MemoryLimit,CPUShares,BlockIOWeight: 这些选项用于设置切片的资源限制。
[Automount]部分:如果你的服务需要在文件系统被自动挂载时运行,你可以使用这个部分来设置自动挂载点。Where: 这个选项用于指定自动挂载点的路径。DirectoryMode: 这个选项用于设置自动挂载点的权限。
这些选项的详细说明可以在 man systemd.timer,man systemd.path,man systemd.slice,man systemd.automount 等手册页中找到。
[Timer]和[Socket]部分实际上是在独立的.timer和.socket单元文件中定义的,而不是在.service单元文件中。它们通常用于启动.service单元。
.timer单元用于定时启动服务。例如,你可以创建一个.timer单元来定时运行一个备份服务。.socket单元用于基于socket激活的服务。例如,你可以创建一个.socket单元来监听一个特定的端口,并在有连接到达时启动服务。
这些.timer和.socket单元需要与一个.service单元关联,通常它们的名字是相同的。例如,foo.timer会启动foo.service,bar.socket会启动bar.service。
虽然这些单元类型有不同的用途和配置选项,但它们的基本结构是相同的,包括[Unit]部分和[Install]部分。在[Unit]部分,你可以设置单元的描述和依赖关系;在[Install]部分,你可以设置单元的安装目标。
0 Comments