Systemd对linux来说,就是一个init程序,可以作为sysVinit和Upstat的替代
RHEL7监视和控制systemd的主要命令是systemctl,该命令可以用于查看系统状态和管理系统及服务。
RHEL7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下。每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]
[Unit]部分主要是对这个服务的说明,内容包括Description和After,Description用于描述服务,After用于描述服务类别
[Service]部分是服务的关键,是服务的一些具体运行参数的设置,这里Type=forking是后台运行的形式,PIDFile为存放PID的文件路径,ExecStart为服务的具体运行命令,ExecReload为重载命令,ExecStop为停止命令,注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
[Install]部分是服务安装的相关设置,可设置为多用户的.
注意: 如果服务没有Install段落,一般意味着应该通过其它服务自动调用它们
注:用户自定义服务脚本按照上面编写完成后,以754的权限保存在/usr/lib/systemd/system目录下,这时就可以利用systemctl进行配置了依赖关系:
使用systemd时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元A要求单元B在A启动之前运行。在此情况下,向单元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依赖关系是可选的,可添加 Wants=B 和 After=B。请注意 Wants= 和 Requires= 并不意味着 After=,即如果 After= 选项没有制定,这两个单元将被并行启动。依赖关系通常被用在服务(service)而不是目标(target)上。
启动方式:
编写自定义的service文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。具体的参数说明请参阅 man systemd.service 。
Type=simple:systemd认为该服务将立即启动。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务随后退出的服务。你可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
我们对service和chkconfig两个命令都不陌生,RHEL7系统中systemctl 是管制服务的主要工具,它整合了chkconfig 与 service功能于一体。
systemctl命令的基本操作格式是:
systemctl 动作服务名.service
查看一下--help的信息
systemd提供更优秀的框架以表示系统服务间的依赖关系实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,systemd的目标是尽可能启动更少进程;尽可能将更多进程并行启动。
systemd单位类型(systemctl --type=单位类型,用来过滤单位):
服务(service):管理着后台服务;
挂载(mount)自动挂载(automount):用来挂载文件系统;
目标(target):运行级别;
套接字(socket):用来创建套接字,并在访问套接字后,立即利用依赖关系间接地启动另一单位;
分析系统状态:
systemctl 或systemctl list-units #输出激活的单元
systemctl list-units --type=service #列出active状态的服务
systemctl list-unit-files列出所有已安装服务
systemctl --failed #显示启动失败的服务
systemd-cgls以树形列出正在运行的进程,它可以递归显示控制组内容
所有可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目录(后者优先级更高)
使用单元:
一个单元可以是系统服务(.service)、挂载点(.mount)、sockets(.sockets)。
使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service)。但是有些单元可以在systemctl中使用简写方式。如果无扩展名,systemctl 默认把扩展名当作 .service。例如sshd和sshd.service 是等价的。
挂载点会自动转化为相应的 .mount 单元。例如 /home 等价于 home.mount。
设备会自动转化为相应的 .device 单元,所以 /dev/sda2 等价于 dev-sda2.device。
systemctl start <单元> #立即启动单元
systemctl stop <单元> #立即停止单元
systemctl restart <单元> #重启单元
systemctl reload <单元> #重新读取单元配置
systemctl status <单元> #输出单元运行状态
systemctl is-enabled <单元> #检查单元是否配置为自动启动
systemctl enable <单元> #开机自动启动单元
systemctl disable <单元> #取消开机自动激活单元
systemctl is-active<单元> #查看单元是不是正在运行
systemctl daemon-reload #重新载入 systemd,扫描新的或有变动的单元
电源管理:
systemctl reboot #重启
systemctl poweroff #退出系统并停止电源
例如:
systemctl is-enabled iptables.service
systemctl is-enabled servicename.service #查询服务是否开机启动
systemctl enable *.service #开机运行服务
systemctl disable *.service #取消开机运行
systemctl start *.service #启动服务
systemctl stop *.service #停止服务
systemctl restart *.service #重启服务
systemctl reload *.service #重新加载服务配置文件
systemctl status *.service #查询服务运行状态
systemctl mask *.service #禁用指定服务
systemctl unmask *.service #激活指用服务
注:*代表某个服务的名字,如http的服务名为httpd
案例:
查看服务的状况
停止 sshd服务, 查看状态
状态表示为dead服务已经停止。
disable 服务,禁止开机自动运行
开机自动加载,并启动该服务
通过mask来禁用该服务,这样一旦服务终止,则无法再启动,必须通过unmask解除禁用才能使用systemctl start sshd 来运行服务
除了上面提到的基本功能,systemctl还可以查询当前加载的模块单元,注意后缀为service的才是我们需要管理的服务
可以通过 type来过滤掉其他类型的单元
systemctl list-unit-files �Ctype service