linux系统服务systemd探讨

前言

el7之前CentOS采用init进程来启动服务
init管理服务启动一般会使用以下命令

/etc/init.d/nginx start	
service nginx start

但是init有一些缺点

  • init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  • init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

为了解决这些问题诞生了systemd。
根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。 实际上Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面 使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。

[root@el7 ~]# ps aux |head -10|sort -k 2 -n 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  43724  3984 ?        Ss    2022   0:47 /usr/lib/systemd/systemd --system --deserialize 21

systemd相关的一些命令

设置系统启动级别

Linux下一共有七个启动级别(0-6)

0 - halt (Do NOT set initdefault to this)	# 系统停机模式,系统默认运行级别不能设置为0,不然的话是没办法正常启动的,这个启动级别下,机器就是关机的状态
1 - Single user mode	# 单用户模式,有root权限,用于系统的维护,禁止远程登录,没有网络功能,就像windows的安全模式
2 - Multiuser, without NFS (The same as 3, if you do not have networking)	# 多用户模式,没有NFS和网络的支持
3 - Full multiuser mode	# 完整的多用户文本模式,有NFS和网络,登录后进入控制台的命令行模式
4 - unused	# 系统保留
5 - X11		# 图形化模式,登陆后进入图形GUI模式
6 - reboot (Do NOT set initdefault to this)	# 重启模式

需要切换这些级别的话也很简单

init 0   #关机
init 3   #文本模式
init 5   #图形化界面模式
init 6   #重启

用systemd获取默认启动级别

[root@el7 ~]# systemctl get-default 
multi-user.target	# 完整多用户模式

systemd设置和切换模式

systemctl set-default multi-user.target	# 设置为完整多用户模式
systemctl set-default graphical.target	# 设置为图形化

systemctl isolate multi-user.target		# 将当前模式切换为多用户
systemctl isolate graphical.target		# 将当前模式切换为图形化

管理服务启停

Linux下有很多进程是在后台一直跑的,也就是我们说的守护进程或者daemon进程
用systemctl 配合以下命令即可进行管理

restart:重启服务,可启动服务
reload:服务重新加载配置文件
status:查看服务状态
start:启动服务
stop:停止服务
enable:开启自启
disable:关闭自启

其他用法

systemctl命令专门用来管理服务(守护进程)

systemctl [list-units] #列出所有服务的运行状态
systemctl list-unit-files #列出所有服务的开机自启状态
systemctl daemon-reload #重新加载systemd服务
systemctl list-dependencies #查看服务的依赖关系
systemctl --failed #查看启动失败的服务
systemctl --type=service #查看常用服务的运行状态(不包含系统服务)

systemctl list-dependencies multi-user.target #查看指定target包含的所有服务(unit)
服务状态说明(systemctl status):
loaded #服务初始化完成,已正常加载配置文件
not-found #服务配置文件没有找到
falied #服务启动失败,配置文件错误
actvie(running) #服务正在运行一个或多个进程
actvie(exited) #仅执行一次就正常结束的服务,目前并没有任何进程在系统中执行
active(waitting) #正在执行当中,不过还需要等待其他的事件才能继续处理
inactive #服务关闭
enabled #服务启用自启
disabled #服务禁用自启
static #服务开机启动项不可被管理
masked #服务禁止建立启动链接
注:static指服务对应的service文件中没有定义[Install]区域,因此无法配置为开机启动服务,只能作为其他配置文件的依赖。
常用参数(参数后面接上服务名,服务名的.service后缀可省略):
mask:冻结(禁用)服务启动脚本
unmask:启用服务启动脚本
  • 启动脚本解释
开机自启就是在/etc/systemd/system/multi-user.target.wants/目录里建立对应服务的启动脚本的软链接。
自启就是删除/etc/systemd/system/multi-user.target.wants/目录中对应服务的软链接。
启动脚本保存在/usr/lib/systemd/system/目录下
启动脚本保存在/etc/systemd/system/目录下

配置systemd管理其他服务

很多情况下我们会进行编译安装,编译完成之后我们如果用systemd来管理的话需要写一个service文件

vim /etc/systemd/system/服务名.service
[Unit]
Description=服务描述
Documentation=文档地址
Wants=其他服务#network.target
After=其他服务#syslog.target network.target

[Service]
Type=simple #服务类型
User=用户名 #服务执行的用户,默认为root,其他用户管理systemd需经过root同意
Environment=环境变量 #定义环境变量
ExecStartPre=启动服务之前执行的命令
ExecStopPost=停止服务之后执行的命令
ExecStart=启动服务执行的命令
ExecReload=重启服务执行的命令
ExecStop=停止服务执行的命令
#执行的命令必须是绝对路径(脚本或进程),不能执行shell的内部命令

[Install]
WantedBy=multi-user.target #定义为开机启动项

最后还需要用户手动让systemd进程重新读取service启动脚本:
systemctl daemon-reload
服务类型说明(Type):
simple:默认值,执行ExecStart指定的命令,启动主进程
forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
dbus:当前服务通过D-Bus启动
notify:当前服务启动完毕,会通知Systemd进程,然后再继续往下执行
idle:若有其他任务执行完毕,当前服务才会运行

systemd-analyze命令用于查看服务启动过程和耗时:
systemd-analyze #查看系统开机时间
systemd-analyze blame #查看每个服务的启动耗时
systemd-analyze critical-chain #显示瀑布状的启动过程流,逆序
systemd-cgls #以树形结构列出正在运行的进程


服务的启动日志默认保存在/var/log/message文件

之后就可以正常使用systemctl命令了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值