前言
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命令了