从 RHEL 7.x 以后,Red Hat 系列的 distribution 放弃沿用多年的 System V 开机启动服务的流程,就是init 启动脚本的方法,改用 systemd 这个启动服务管理机制;

systemd 将过去所谓的 daemon 执行脚本通通称为一个服务单位 (unit),而每种服务单位依据功能来区分时,就分类为不同的类型 (type)。 基本的类型有包括系统服务、数据监听与交换的插槽档服务 (socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境 (target) 等等。 哇!这么多类型,那设定时会不会很麻烦呢?其实还好,因为配置文件都放置在底下的目录中:

        l  /usr/lib/systemd/system/:每个服务最主要的启动脚本设定,有点类似以前的 /etc/init.d  底下的文件;

        l  /run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比 /usr/lib/systemd/system/  高!

        l  /etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx 之类的功能!执行优先序又        比 /run/systemd/system/  高喔!


一、用systemctl命令管理运行nginx项目:

rhel7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下

每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]

1、建立服务文件

文件路径
vi /usr/lib/systemd/system/nginx.service

文件内容
[Unit]
Description=Nginx server
After=network.target

[Service]
Type=forking
PIDFile=/opt/nginx/run/nginx/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf 
ExecStart=/usr/local/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target


2、设置开机启动

systemctl enable nginx.service


3、使用命令

启动nginx服务
systemctl start nginx.service

查看状态
systemctl status nginx.service

重启服务
systemctl restart nginx.service

停止服务
systemctl stop nginx.service

查看所有服务
systemctl list-units --type=service


二、参数文件说明:

[Unit]:服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务
表示如果network.target或sshd-keygen.service需要启动,那么nginx.service应该在它们之后启动。

[Service]服务运行参数的设置
Type=forking是后台运行的形式
PIDFile : pid文件路径
ExecStartPre :启动服务之前执行的命令(启动前要做什么,上文中是测试配置文件 -t)
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径

[Install]服务安装的相关设置,可设置为多用户


Type字段定义启动类型。它可以设置的值如下:

Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是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认为服务就绪。


Install区块,定义如何安装这个配置文件,即怎样做到开机启动。

WantedBy字段:表示该服务所在的 Target。

Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,nginx 所在的 Target 是multi-user.target

这个设置非常重要,因为执行systemctl enable nginx.service命令时,nginx.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。


Systemd 有默认的启动 Target。

# systemctl get-default 
multi-user.target

上面的结果表示,默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么systemctl enable命令能设置开机启动的原因。


三、如何启动/关闭、启用/禁用服务

[root@study ~]# systemctl [command] [unit]
command 主要有:
start:立刻启动后面接的 unit stop:立刻关闭后面接的unit
restart:立刻关闭后启动后面接的unit,亦即执行stop再start的意思
reload:不关闭后面接的unit的情况下,重载配置文件,让设定生效
enable:设定下次开机时,后面接的unit会被启动
disable:设定下次开机时,后面接的unit不会被启动
status:目前后面接的这个unit的状态,会列出有没有正在执行、开机预设执行否、登录等信息等!
is-active:目前有没有正在运作中
is-enable:开机时有没有预设要启用这个unit

例如:
启动一个服务:systemctl start postfix.service
关闭一个服务:systemctl stop postfix.service
重启一个服务:systemctl restart postfix.service
显示一个服务的状态:systemctl status postfix.service
在开机时启用一个服务:systemctl enable postfix.service
在开机时禁用一个服务:systemctl disable postfix.service
查看服务是否开机启动:systemctl is-enabled postfix.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
PS:使用命令 systemctl is-enabled postfix.service 得到的值可以是enable、disable或static,这里的static它是指
对应的Unit文件中没有定义[Install]区域,因此无法配置为开机启动服务。说明:启用服务就是在当前“runlevel”的配置
文件目录/etc/systemd/system/multi-user.target.wants/里,建立/usr/lib/systemd/system里面对应服务配置文件的软链接;

禁用服务就是删除此软链接,
添加服务就是添加软连接。如下:
#systemctl disable nfs-server.service
rm '/etc/systemd/system/multi-user.target.wants/nfs-server.service'

#systemctl enable nfs-server.service
ln -s '/usr/lib/systemd/syste/nfs-server.service' '/etc/systemd/system/multi-user.target.wants/nfs-server.service'


四、查看所有unit服务

[root@study ~]# systemctl
[root@study ~]# systemctl list-unit-files
[root@study ~]# systemctl list-units --type=service --all
[root@study ~]#systemctl list-units --type=target --all
systemd 也提供了数个简单的指令给我们切换操作模式之用喔! 大致上如下所示:
[root@study ~]# systemctl poweroff 系统关机
[root@study ~]# systemctl reboot   重新启动
[root@study ~]# systemctl suspend  进入暂停模式
[root@study ~]# systemctl hibernate 进入休眠模式
[root@study ~]# systemctl rescue   强制进入救援模式
[root@study ~]# systemctl emergency 强制进入紧急救援模式