systemctl是debain系服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。可以使用它永久性或只在当前会话中启用/禁用服务。

服务权限

systemd有系统和用户区分;系统(/user/lib/systemd/system/)、用户(/etc/lib/systemd/user/).

不过一般我们会将文件存放在/etc/systemd/system/目录下面。

创建服务文件

[Unit]
Description=
Documentation=
Before=
After=
Requires=
Wants
  
[Service]
Type=
PIDFile=
ExecStartPre=
ExecStart=
ExecReload=
ExecStop=
PrivateTmp=
  
[Install]
WantedBy=multi-user.target

[unit]

Description : 服务的简单描述

Documentation :服务文档

Before、After : 定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。

Requires :这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。

Wants :推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。

这一部分的内容都是可选的,我一般没有特殊需要的话就只写Description和After,After一般写为network.target,因为我需要运行的基本上都是基于网络的

[Service]

Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。

Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。

Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。

Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。

Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。

Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。

PIDFile:pid文件路径

ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。

ExecReload:指定单元停止时执行的命令或者脚本。

ExecStop:指定单元停止时执行的命令或者脚本。

PrivateTmp:True表示给服务分配独立的临时空间

Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。

RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。

[Install]

Alias:为单元提供一个空间分离的附加名字。

RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。

WantBy:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。

Also:指出和单元一起安装或者被协助的单元。

DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例。

重载服务

当我们需要使该服务实现自启的话,我们使用命令实现自启(xxx为你建立的文件名)

systemctl enable xxx.service

这一命令会在/etc/systemd/system/multi-user.target.wants/目录下新建一个/usr/lib/systemd/system/xxx.service 文件的链接。

操作服务

#启动服务
sudo systemctl start xxx
  
#查看日志
sudo journalctl -f -u xxx
  
#重启
sudo systemctl restart xxx
  
#重载
sudo systemctl reload xxx
  
#停止
sudo systemctl stop xxx

#显示一个服务的状态
systemctl status xxx


#开启开机自启
systemctl enable xxx

#取消开机自启
systemctl disable xxx

#查看服务是否开机启动
systemctl is-enabled xxx

#查看已启动的服务列表
systemctl list-unit-files|grep enabled

#查看启动失败的服务列表
systemctl --failed

命令systemctl is-enabled postfix.service 得到的值可以是enable、disable或static,这里的 static 它是指对应的 Unit 文件中没有定义[Install]区域,因此无法配置为开机启动服务。

使用实例

我就以我下一篇文章会写的一个网盘系统cloudreve为例介绍一下如何设置开机自启

首先我们先明确一下cloudreve如果直接运行应该是如何的,cloudreve直接运行的代码应该是这样的./cloudreve

很简单的一句代码,也正是因为简单,所以我们配置起来也方便。

我们先进入放置service文件的目录,正如开头所说,我们习惯性放于/etc/systemd/system/目录下面,所以我们进入该目录,新建一个文件sudo vi cloudreve.service将下面的内容填入文件内.

[Unit]
Description=cloudreve
After=network.target

[Service]
Type=simple
ExecStart=/path/to/cloudreve
Restart=on-failure

[Install]
WantedBy=multi-user.target

对于不同的程序而言,如果没有特殊要求的话,我们只需要更改Description以及ExecStart两个地方即可,像这儿,我就将Description改为了cloudreve,然后在ExecStart后面写上了cloudreve的运行地址。

这样我们就改好了配置文件。

接下来我们先运行一下测试一下,程序是否可以正常运行

sudo systemctl start cloudreve

为什么写cloudreve呢,这个是对应这前面的文件名的,如果我文件名写出aaa.service,那么我这儿也需要写成aaa

打开网页端,发现正常,所以可以进行下一步操作,如果不正常,请自行检查配置文件

接下来我们用一句代码将cloudreve加入开机启动

sudo systemctl enable cloudreve

到此配置就结束了

Last modification:April 22nd, 2020 at 10:07 pm
如果觉得我的文章对你有用,请随意赞赏