systemd

1、简介:

systemd即为system daemon,是linux下的一种init软件(Linux下,init主要有三个实现版本:System V,传统的init; Upstart,Ubuntu后期针对sys-v的一个改进实现版本; systemd)。启动并维护各种用户空间的服务。都是以  .service为文件后缀。

2、目录:

/usr/lib/systemd/system

或者是  /etc/systemd/system/

3、systemctl

systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。

4、服务类型 unit 的详细配置

配置文件分为三个部分,每个部分中都可以提供详细的配置信息。

[Unit] 部分
Description    关于该 unit 的简易说明。
Documentation    文档相关的内容,如 Documentation=https://prometheus.io/docs/introduction/overview/
                               Documentation=man:sshd(8)
                               Documentation=file:/etc/ssh/sshd_config
After    说明本 unit 是在哪个服务启动之后才启动的意思。仅是说明服务启动的顺序而已,并没有强制要求 。
Before    与 After 的意义相反,在指定的服务启动前最好启动本个服务的意思。仅是说明服务启动的顺序而已,并没有强制要求 。
Requires    本 unit 需要在哪个服务启动后才能够启动!就是设置服务间的依赖性。如果在此项设置的前导服务没有启动成功,那么本 unit 就不会被启动!
Wants    与 Requires 刚好相反,规范的是这个 unit 之后还要启动什么服务,如果这 Wants 后面接的服务如果没有启动成功,其实不会影响到这个 unit 本身!
Conflicts    这个项目后面接的服务如果有启动,那么本 unit 就不能启动!如果本 unit 启动了,则指定的服务就不能启动。

[Service] 部分
Type
说明这个服务的启动方式,会影响到 ExecStart,主要有下面几种类型:
simple:默认值,这个服务主要由 ExecStart 设置的程序来启动,启动后常驻于内存中。
forking:由 ExecStart 指定的启动的程序通过 spawns 产生子进程提供服务,然后父进程退出。
oneshot:与 simple 类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中。
dbus:与 simple 类似,但这个服务必须要在取得一个 D-Bus 的名称后,才会继续运行!因此设置这个项目时,通常也要设置 BusName= 才行。
idle:与 simple 类似,意思是,要执行这个服务必须要所有的工作都顺利执行完毕后才会执行。这类的服务通常是开机到最后才执行即可的服务。
notify:与 simple 类似,但这个服务必须要收到一个 sd_notify() 函数发送的消息后,才会继续运行。

ExecStart
就是实际执行此服务的程序。接受 "命令 参数 参数..." 的格式,不能接受 <, >, >>, |, & 等特殊字符,很多的 bash 语法也不支持。所以,要使用这些特殊的字符时,最好直接写入到脚本里面去!

ExecStartPre 和 ExecStartPost 分别在服务启动前后,执行额外的命令。

ExecStop 用来实现 systemctl stop 命令,关闭服务。
ExecReload 用来实现 systemctl reload 命令,重新加载服务的配置信息。

Restart 当设置为 Restart=1 时,如果服务终止,就会自动重启此服务。
RestartSec 与 Restart 配合使用,在服务终止多长时间之后才重新启动它。默认是 100ms。

RemainAfterExit
当设置为 RemainAfterExit=1 时,则当这个服务所属的所有程序都终止之后,此服务会再尝试启动。这对于 Type=oneshot 的服务很有帮助!

[Install] 部分
WantedBy    这个设置后面接的大部分是 *.target unit。意思是,这个 unit 本身是附挂在哪个 target unit 下面。
Also    当目前这个 unit 被 enable 时,Also 后面接的 unit 也要 enable 的意思。
Alias    当 systemctl enable 相关的服务时,则此服务会进行链接文件的创建!

5、Timer 类型 unit 的详细配置

Timer 类型的 unit 主要用来执行定时任务,并有可能取代 cron 服务。由于 timer 类型的 unit 经常与服务类型的 unit 一起使用,所以本文也附带介绍一下 timer unit 的配置。与服务类型的 unit 不同,timer unit 配置文件中的主要部分是 [Timer],下面是其主要的配置项:
OnActiveSec    当 timers.target 启动后多久才执行这个 unit。
OnBootSec    当开机后多久才执行这个 unit。
OnStartupSec    当 systemd 第一次启动后多久才执行这个 unit。
OnUnitActiveSec    这个 timer 配置文件所管理的那个 unit 服务在最后一次启动后,隔多久后再执行一次。
OnUnitInactiveSec    这个 timer 配置文件所管理的那个 unit 服务在最后一次停止后,隔多久后再执行一次。
Unit    一般不需要设置,基本上我们设置都是 服务名称.server + 服务名称.timer。如果你的服务名称和 timer 名称不相同,就需要在 .timer 文件中通过 Unit 项指定服务的名称。
OnCalendar    使用实际时间(非循环时间)的方式来启动服务。
Persistent    当使用 OnCalendar 的设置时,指定该功能要不要持续执行。

6、一次性服务

Type=oneshot 用于那些只需要执行一次性动作而不需要持久运行的单元, 例如文件系统检查或者清理临时文件。 此类单元, 将会在启动后一直等待指定的动作完成, 然后再回到停止状态。 下面是一个执行清理动作的单元:

[Unit]
Description=清理老旧的 Foo 数据

[Service]
Type=oneshot
ExecStart=/usr/sbin/foo-cleanup     #后面跟程序的绝对路径,如果有启动参数,后面加上,  ExecStart=/home/catchlog.sh (或者绝对路径 ExecStart=/tsd/bin/cns-gateway)

[Install]
WantedBy=multi-user.target

7、通过脚本定时备份文件

备份文件的 bash 脚本:

#!/bin/bash
mydate()
{
        date "+%Y%m%d%H%M%S"
}
backupdate=$(mydate)
tar -zcf /tmp/backup.${backupdate}.tar.gz /home/nick/learn

把上面的代码保存到文件 /usr/local/bin/backupdir.sh,并添加可执行权限:

$ sudo chmod +x /usr/local/bin/backupdir.sh

然后创建 service unit 配置文件:

[Unit]
Description=nick backup learn dir service
 
[Service]
User=nick
Group=nick
Type=simple
ExecStart=/usr/local/bin/backupdir.sh
 
[Install]
WantedBy=multi-user.target

把上面的 unit 配置保存到文件 /etc/systemd/system/nickbak.service。
然后执行下面的命令测试服务的执行情况:

$ sudo systemctl daemon-reload
$ sudo systemctl start nickbak.service

这样的备份任务只会在执行 sudo systemctl start nickbak.service 时执行一次。下面我们通过 timer unit 把它配置为定时执行。
创建 timer unit 配置文件:

[Unit]
Description=nick backup learn dir timer
 
[Timer]
OnCalendar=*:/
Persistent=true
Unit=nickbak.service
 
[Install]
WantedBy=multi-user.target

把上面的 unit 配置保存到文件 /etc/systemd/system/nickbak.timer。配置中 OnCalendar=*:0/15 表示每 15 分钟执行一次 nickbak.service 服务。

执行下面的命令把 nickbak.timer 设置为开机启动,并启动 nickbak.timer:

$ sudo systemctl daemon-reload
$ sudo systemctl enable nickbak.timer
$ sudo systemctl start nickbak.timer

现在来看看 nickbak.timer 的状态:

$ sudo systemctl status nickbak.timer

 (see: https://www.bbsmax.com/A/QV5ZLjB6zy/)

原文地址:https://www.cnblogs.com/yangjj08/p/12053318.html