CentOS7服务管理工具systemctl 简单使用

转载。

systemd核心概念unit(单元)类型:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息

cd /usr/lib/systemd/system
ls -l

常见unit类型 :

  • service :文件扩展名为.service, 用于定义系统服务
  • target :文件扩展名为.target,用于对 unit 进行逻辑分组,引导其他 unit 的执行。它替代了 SysV 中运行级别的作用,并提供更灵活的基于特定设备事件的启动方式。例如 multi-user.target 相当于过去的运行级别5,而 bluetooth.target 在有蓝牙设备接入时就会被触发
  • device :用于定义内核识别的设备
  • mount:定义文件系统挂载点
  • socket:用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
  • snapshot :管理系统快照
  • swap:用于标识swap设备
  • automount :文件系统的自动挂载点
  • path:用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务

最常用的大概是 service 和 target。

管理一个service 文件

systemctl 提供了一组子命令来管理单个的 unit,其命令格式为:

systemctl [command] [unit]

command 主要有:

start:立刻启动后面接的 unit。
stop:立刻关闭后面接的 unit。
restart:立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思。
reload:不关闭 unit 的情况下,重新载入配置文件,让设置生效。
enable:设置下次开机时,后面接的 unit 会被启动。
disable:设置下次开机时,后面接的 unit 不会被启动。
status:目前后面接的这个 unit 的状态,会列出有没有正在执行、开机时是否启动等信息。
is-active:目前有没有正在运行中。
is-enabled:开机时有没有默认要启用这个 unit。
kill :不要被 kill 这个名字吓着了,它其实是向运行 unit 的进程发送信号。
show:列出 unit 的配置。
mask:注销 unit,注销后你就无法启动这个 unit 了。
unmask:取消对 unit 的注销

测试一个service 文件。比如nginx

cat nginx.service
[root@manager system]# cat nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

大致分为三块
Unit Service Install 详细解释 可以看大神博客 不知道允不允许贴链接
https://www.csdn.net/article/2015-02-27/2824034

Unit 段

  • Description 一段描述这个Unit文件的文字。
  • After 在后面列出的所有模块启动完成后才会启动当前服务

Service 段

  • Type 服务的类型,常用的有 simple(默认类型) 和 forking。默认的 simple 类型可以适应于绝大多数的场景,因此一般可以忽略这个参数的配置。而如果服务程序启动后会通过 fork 系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将 Type 的值设置为 forking,否则 systemd 将不会跟踪子进程的行为,而认为服务已经退出。
  • PIDFile 服务运行时进程文件位置
  • ExecStartPre 指定在启动执行 ExecStart 的命令前的准备工作,可以有多个
  • ExecStart 指定服务启动的主要命令,在每个配置文件中只能使用一次
  • ExecReload 重新加载服务所需执行的主要命令

Install 段

这个段中的配置与 Unit 有几分相似,但是这部分配置需要通过 systemctl enable 命令来激活,并且可以通过 systemctl disable 命令禁用。另外这部分配置的目标模块通常是特定启动级别的 .target 文件,用来使得服务在系统启动时自动运行。

  • WantedBy 列出的是依赖当前服务的模块。

上面使用的是 “WantedBy=multi-user.target” 表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。当然还需要 systemctl enable 激活这个服务以后自动运行才会生效。

使用systemctl 管理服务。

比如还是 nginx 后面的服务名就是要启动的服务

  • 启动服务 systemctl start nginx
  • 停止服务 systemctl stop nginx
  • 重启服务 systemctl restart nginx
  • 查看服务状态

查看服务状态

  • 设置开机自动启动服务
systemctl enable nginx
  • 取消开机自动启动
systemctl disable nginx

设置开机启动与取消
深入考虑,这个也不算是开机启动。而是开机运行在multi-user 模式下,multi-user 会启动该服务,这又和target 有关系。下一节在学习。

  • 注销服务
systemctl mask nginx

注销服务
一旦注销,服务就会无法启动

  • 取消注销
systemctl unmask nginx

取消注销后服务才可以重新启动。

  • 查看服务是否运行 systemctl is-active nginx
  • 查看服务是否开机自启 systemctl is-enabled nginx
  • 查看服务依赖关系 systemctl list-dependencies nginx
systemctl list-dependencies nginx

查看nginx这个unit依赖的其它unit 如果加上–reverse 就是反向解析哪些unit依赖nginx

具体可以 使用 systemctl -h 查看帮助。
systemctl 也兼容了service。尝试执行一个命令时也会在/etc/init.d目录 查找

target 文件

这个target的解释,大约是一组unit。有些target可以看做一种运行状态,在这个运行状态中,启动了那些unit。

看其他博客解释,很像是之前的运行级别概念,但是又不全是。

为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已,这样便可以对配置单元做一个统一的控制,就可以实现大家都非常熟悉的运行级别的概念。比如,想让系统进入图形化模式,需要运行许多服务和配置命令,这些操作都由一个个的配置单元表示,将所有的这些配置单元组合为一个目标(target),就表示需要将这些配置单元全部执行一遍,以便进入目标所代表的系统运行状态。

查看当前 运行target, Get the name of the default target

systemctl get-default

显示的 multi-user.target
应该是一个比较常用的 target了。我没有安装图形界面。

查看当前target 启动了哪些服务。后面没有带unit就是查看默认target 依赖那些unit。

systemctl list-dependencies

默认target依赖

可以看到 target 确实应该是一个unit 组的概念。运行模式也被看做一个target,只是这个target包含的unit比较多。

切换系统运行模式。(再次说一遍,但是自己也不确定对不对的理解。运行模式是一个target。但应该不是所有target都可以当成运行模式)

systemctl isolate NAME

NAME表示target。比如切换到multi-user 模式。。。这个。尽管本来就是multi模式

systemctl isolate multi-user

在一般情况下,使用上述 isolate 的方式即可完成不同 target 的切换。不过为了方便起见,systemd 也提供了

几个简单的指令用来切换操作模式,大致如下所示:

sudo systemctl poweroff # 系统关机
sudo systemctl reboot  # 重新开机
sudo systemctl suspend  # 进入暂停模式
sudo systemctl hibernate # 进入休眠模式
sudo systemctl rescue  # 强制进入救援模式
sudo systemctl emergency # 强制进入紧急救援模式

如果看成运行级别 大概是

级别0:runlevel0.target或shutdown.target
级别1:runlevel1.target或rescue.target
级别2:runlevel2.target或multi-user.target
级别3:runlevel3.target或multi-user.target
级别4:runlevel4.target或multi-user.target
级别5:runlevel5.target或graphical.taget
级别6:runlevel6.targe或reboot.target

关于开机自启的学习
nginx 为例
查看当前的运行模式

systemctl get-default

当前运行模式multi-user
查看该target的依赖关系。

systemctl list-dependencies multi-user.target

内容很多。表示了这个模式依赖的一些unit。猜测设置开机启动 就是 将 nginx加入成为multi-user的依赖。
设置开机启动查看提示

[root@manager ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

创建了一个软链接。
/etc/systemd/system/multi-user.target.wants/nginx.service
指向了
/usr/lib/systemd/system/nginx.service
查看目录
/etc/systemd/system/multi-user.target.wants

cd  /etc/systemd/system/multi-user.target.wants
ls -l

wants目录
可以看到是一些软链接文件。根据前面service文件解释,wants触发启动列出的每个 Unit 模块,而不去考虑这些模块启动是否成功。wants 目录应该是target 要启动的所有unit。里面有刚才加入的 nginx.service
再次查看multi-user的依赖。可以发现有 nginx了
依赖

查看总体运行情况

其他的配置文件 感觉不常用,我也不知道怎么用。。。就不提了。查看一下总体unit的情况。

systemctl 提供了子命令可以查看系统上的 unit,命令格式为:

systemctl [command] [--type=TYPE] [--all]

command 有:

  • list-units:列出当前已经启动的 unit,如果添加 -all 选项会同时列出没有启动的 unit。
  • list-unit-files:根据 /lib/systemd/system/ 目录内的文件列出所有的 unit。还可以通过这个查看unit是否开机启动

–type=TYPE:可以过滤某个类型的 unit。比如service/target/

不带任何参数执行 systemctl 命令会列出所有已启动的 unit:

systemctl 
systemctl list-units 

效果一致。
列出所有的units查看状态

systemctl list-units --all

列出所有已启动的 target

systemctl list-units --type=target

列出所有的unit。查看是否开机启动

 systemctl list-unit-files 

传统命令init,poweroff,halt,reboot都成为systemctl的软链接
关机:systemctl halt、systemctl poweroff
重启:systemctl reboot
挂起:systemctl suspend
休眠:systemctl hibernate
休眠并挂起:systemctl hybrid-sleep

大致如此,由于个人都不太理解。因此这篇博客更多是供自己复习使用,待有了更深的认识,可能要重新修改。

参考资料太多,可能没有一一贴全。
https://www.cnblogs.com/isme-zjh/p/11685233.html
https://blog.csdn.net/skh2015java/article/details/94012643
https://www.cnblogs.com/shijingjing07/p/9301590.html
https://www.pianshen.com/article/61511272363/
https://www.jianshu.com/p/a740255a9b69
https://blog.csdn.net/u011314255/article/details/80314003

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章