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