RHEL7里面,初始进程变成了systemd。RHEL6和之前的版本使用的初始进程是init,init是一个线性的启动过程,一个接一个的启动,比较慢;systemd则可以多进程启动,速度提高很多。另外,systemd还有简化了开发,集成日志等优点。
service:代表一个后台服务进程,比如 mysqld。这是最常用的一类。
target:此类配置单元为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已,这样便可以对配置单元做一个统一的控制,就可以实现大家都非常熟悉的运行级别的概念。比如,想让系统进入图形化模式,需要运行许多服务和配置命令,这些操作都由一个个的配置单元表示,将所有的这些配置单元组合为一个目标(target),就表示需要将这些配置单元全部执行一遍,以便进入目标所代表的系统运行状态(例如:multi-user.target相当于在传统使用sysv的系统中运行级别5)。
一、systemd 开启和监督整个系统
1、所有可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目录(后者优先级更高)
2、创建单位用的系统配置文件位于 /usr/lib/systemd/system/,但 /etc/systemd/system 目录下的同名文件会优先于前者
二、systemd 的工具
systemctl :用作内省和控制 systemd 系统和服务管理器的状态
立即激活单元:
# systemctl start <单元>
立即停止单元:
# systemctl stop <单元>
重启单元:
# systemctl restart <单元>
命令单元重新读取配置:
# systemctl reload <单元>
输出单元运行状态:
$ systemctl status <单元>
检查单元是否配置为自动启动:
# systemctl is-enabled <单元>
开机自动激活单元:
# systemctl enable <单元>
取消开机自动激活单元:
# systemctl disable <单元>
显示单元的手册页(必须由单元文件提供):
# systemctl help <单元>
重新载入 systemd,扫描新的或有变动的单元:
# systemctl daemon-reload
三、单位的处理
创建单位用的系统配置文件位于/usr/lib/systemd/system/,但 /etc/systemd/system 目录下的同名文件会优先于前者。
单位文件的定义通常比传统的 sysvinit 脚本要短得多。例如,用于通过 NTP 来同步网络时间的服务只有短短几行:
[Unit]
Description=Network Time Service
[Service]
ExecStart=/usr/bin/ntpd -n -u ntp:ntp -g
[Install]
WantedBy=multi-user.target
1)所有的单位文件都包含由[Unit]开头的一节,其中包含一般设置与简
2)[Service]一节含有针对该服务要进行的任务的指定设置——对于 NTP 来说,仅需要启动该服务的命令行。如果需要用一个指定的命令来终止程序,你可以用 ExecStop= 来进行设置。这一步对于 NTP 守护进程是不需要的,因为根据 Unix 传统,它可以用一个简单的“SIGTERM”信号来结束。如果没有指定其他命令,这个命令会告诉 systemd 结束任务。
3)[Install]一节包含了 systemd 在(反)安装时要解释的说明;这里的 NTP 一例中,其内容意为在“多用户”目标激活时应当同步时间。
四、自己编写 .service 文件
关于service单元配置文件
Description是对服务的描述,方便记忆和阅读,一般来说这里可以随心所欲的。
Wants是服务项的启动依赖那些项。
Type是服务的类型,有simple,forking,oneshot,dbus,notify,idle。其中我们常用的类型有simple,forking,oneshot。simple 是默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切都退出。forking 标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。oneshot种服务类型就是启动,完成,没进程了。
ExecStart是启动脚本的路径和参数,参数和脚本之间用空格分割。
Restart是配置启动项是否需要重启,有no,on-success,on-failure,on-abnormal,on-watchdog,on-abort,always。这些选项就是他们字面意思,abnormal意思是反常的,看文档里面说除了信号SIGHUP,SIGINT,SIGTERM,SIGPIPE以外其他信号终止的,都是反常的包含code dump,操作超时等。
WantBy指服务在何种情况下面会被启动,例如上面multi-user.target指的是多用户环境
1、处理依赖关系
使用systemd时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元A要求单元B在A启动之前运行。在此情况下,向单元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依赖关系是可选的,可添加 Wants=B 和 After=B。请注意 Wants= 和 Requires= 并不意味着 After=,即如果 After= 选项没有制定,这两个单元将被并行启动。
依赖关系通常被用在服务(service)而不是目标(target)上。例如, network.target 一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target 已经启动。
2、启动方式
编写自定义的 service 文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。具体的参数说明请参阅 man systemd.service 。
3、修改现存单元文件
要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/<单元名>.d/ 的目录(如 /etc/systemd/system/httpd.service.d/),然后放入 *.conf 文件,其中可以添加或重置参数。这里设置的参数优先级高于原来的单元文件。例如,如果想添加一个额外的依赖,创建这么一个文件即可:
/etc/systemd/system/
[Unit]
Requires=<新依赖>
After=<新依赖>
然后运行以下命令使更改生效:
# systemctl daemon-reload
# systemctl restart <单元>
此外,把旧的单元文件从 /usr/lib/systemd/system/ 复制到 /etc/systemd/system/,然后进行修改,也可以达到同样效果。在 /etc/systemd/system/ 目录中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 目录中的同名单元文件。注意,当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。此外,你还得执行 systemctl enable
查看开机是否启动
systemctl is-enabled xx.service #查询服务是否开机启动
平滑重启: HUB让进程挂起睡眠
kill -HUP $MAINPID
五、完整案例:
$ systemctl cat sshd.service
[Unit]
#服务描述
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
#在哪些服务之后启动
After=network.target sshd-keygen.service
#弱依赖关系,sshd-keygen.service停止,sshd.service
不会停止
Wants=sshd-keygen.service
#强依赖关系,network.service 停止,sshd.service
停止
Require=network.service
[Service]
#环境参数文件
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
#服务重启,$MAINPID为主进程
ExecReload=/bin/kill -HUP $MAINPID
#simple(默认值)ExecStart字段启动为主进程,forKing
以fork()的形式启动,父进程停止,子进程为主进程
Type=simple
KillMode=process
Restart=on-failure
RestartSec=42s
#Install区块,定义怎样做到开机启动
[Install]
#WantedBy字段:表示该服务所在的Target,Target含义是服务组,表示一组服务。这个设置非常重要,因为执行systemctl enable sshd.service时,sshd.service的一个符号链接就会放在/etc/systemd/system目录下的multi-user.target.wants。下面的结果表示,默认的启动Target是multi-user.target。在这个组里的所有服务,都将开机启动。这就是systemctl enable 能设置开机启动的原因。
WantedBy=multi-user.target
六、Tomcat案例及其说明
[Unit]
#服务简单说明
Description=tomcat1.service
#在哪个服务组启动后再启动
After=network.target
弱依赖,即使network.service宕掉,该服务也不会停止,Require 强依赖,一服务宕掉,依赖服务停止
Wants=network.service
[Service]
启动类型fork,父进程停掉,子进程变为主进程,使用此类型,需指定PIDFile
Type=forking
#需要在catalina.sh中添加PIDFILE
PIDFile=/var/run/tomcat.pid
Environment='JAVA_HOME=/usr/local/jdk1.8.0_171'
Environment='JRE_HOME=/usr/local/jdk1.8.0_171/jre'
ExecStart=/usr/local/apache-tomcat-81/bin/startup.sh
ExecStop=/usr/local/apache-tomcat-81/bin/shutdown.sh
#服务重启,$MAINPID 程序主进程
ExecReload=/bin/kill -HUB $MAINPID
Private Tmp=true
[Install]
WantedBy=multi-user.target