Systemd 、systemctl进程管理工具
一、systemctl是Systemd 的主命令,可用于管理系统。
1、列出所有已经加载的systemd units
systemctl systemctl | grep docker.service
2、列出所有service
systemctl list-units --type=service systemctl --type=service
3、列出所有active状态(运行或退出)的服务
systemctl list-units --type=service --state=active
4、列出所有正在运行的服务
systemctl list-units --type=service --state=running
5、列出所有正在运行或failed状态的服务
systemctl list-units --type service --state running,failed
6、列出所有enabled状态的服务
systemctl list-unit-files --state=enabled systemctl list-unit-files ##enabled和disabled
7、关闭开机自启服务
禁止服务自启动:systemctl disable docker.service 查看服务是否自启动:systemctl is-enabled docker.service 列出系统所有服务的启动情况:systemctl list-units --type=service 列出所有自启动服务:systemctl list-unit-files|grep enabled
8、查看系统当前打开的会话数量:loginctl
每开一个终端sessions就会+1
8、确认系统启动耗时
systemd-analyze time Startup finished in 616ms (kernel) + 1.156s (initrd) + 7.026s (userspace) = 8.799s
9、查看内部命令
# enable -a enable . enable : enable [ enable alias enable bg enable bind
二、systemd
systemd是目前centos系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。
所以从CentOS 7开始也由systemd取代了init作为默认的系统进程管理工具。
systemd所管理的所有系统资源都称作Unit,通过systemd命令集可以方便的对这些Unit进行管理。比如systemctl、hostnamectl、timedatectl、localctl等命令,这些命令虽然改写了init时代用户的命令使用习惯(不再使用chkconfig、service等命令),但确实也提供了很大的便捷性。
1、systemd配置文件
-
每一个Unit都需要有一个配置文件用于告知systemd对于服务的管理方式
-
配置文件存放于/usr/lib/systemd/system/,设置开机启动后会在/etc/systemd/system目录建立软链接文件
-
每个Unit的配置文件配置默认后缀名为.service
-
在/usr/lib/systemd/system/目录中分为system和user两个目录,一般将开机不登陆就能运行的程序存在系统服务里,也就是/usr/lib/systemd/system
-
配置文件使用方括号分成了多个部分,并且区分大小写
2、服务类型 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。
KillMode
可以是 process, control-group, none 中的一种,如果是 process 则服务终止时,只会终止主要的程序(ExecStart接的后面那串指令),如果是 control-group 时,则由此 daemon 所产生的其他 control-group 的程序,也都会被关闭。如果是 none 的话,则没有程序会被关闭。
TimeoutSec
若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利 "正常启动或正常结束" 的情况下,则我们要等多久才进入 "强制结束" 的状态!
RemainAfterExit
当设置为 RemainAfterExit=1 时,则当这个服务所属的所有程序都终止之后,此服务会再尝试启动。这对于 Type=oneshot 的服务很有帮助!
环境变量的设置对很多程序来说都是十分重要的,下面的配置则可以以不同的方式为服务程序设置环境变量:
Environment 用来设置环境变量,可以使用多次:
[Service] # Client Env Vars Environment=ETCD_CA_FILE=/path/to/CA.pem Environment=ETCD_CERT_FILE=/path/to/server.crt
EnvironmentFile 通过文件的方式设置环境变量,可以把下面的内容保存到文件 testenv 中:
AAA_IPV4_ANCHOR_0=X.X.X.X BBB_IPV4_PRIVATE_0=X.X.X.X CCC_HOSTNAME=test.example.com
然后指定配置文件
[Service] EnvironmentFile=/testenv
接下来就可以在 ExecStart 配置中使用在文件中设置的环境变量,如:
ExecStart=/xxx --abc=xx${AAA_IPV4_ANCHOR_0}yy
[Install] 部分
WantedBy 这个设置后面接的大部分是 *.target unit。意思是,这个 unit 本身是附挂在哪个 target unit 下面。
Also 当目前这个 unit 被 enable 时,Also 后面接的 unit 也要 enable 的意思。
Alias 当 systemctl enable 相关的服务时,则此服务会进行链接文件的创建!
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 的设置时,指定该功能要不要持续执行。
通过上面的介绍,相信大家对 systemd 服务类型和 timer 类型的 unit 配置已经有了基本的理解,下面让就让我们配置两个实际的例子。
3、部署jar程序 实现systemd管理控制
java -jar decode.jar -Dconfig=/usr/local/abc/application.properties
代码
vim demo.sh #!/bin/bash # source /etc/profile jarName="abc-web.jar" workDir="/usr/local/abc" start(){ cd ${workDir} && java -jar ${jarName} --spring.profiles.active=prod --server.port=9630 >uams.log 2>&1 & } stop(){ ps -ef | grep -qP "(?<=-jar)\s+${jarName}" && kill $(ps -ef | grep -P "(?<=-jar)\s+${jarName}" | awk '{print $2}') } case $1 in start) start ;; stop) stop ;; restart) stop start ;; esac
编写systemd配置文件
vim /usr/lib/systemd/system/abc.service [Unit] Description=uams server Wants=network-online.target After=network.target [Service] Type=forking WorkingDirectory=/usr/local/abc/ ExecStart=/bin/bash uams.sh start ExecStop=/bin/bash uams.sh stop ExecReload=/bin/bash uams.sh restart Restart=on-failure [Install] WantedBy=multi-user.target
三、SysVinit和Systemd对比
SysVinit方式
- 确认系统日志文件
文件名: /var/log/message
文件名:/var/log/syslog
Systemd
- 确认系统日志信息
使用命令: journalctl -f
- 确认某一时间点之后的日志信息
使用命令:journalctl -since=xxx