目录
1、认识service的unit文件
2、systemd 使用语法
3、service unit文件的例子
案例:
1.源码编译安装nginx 实现systemd管理控制
2. 二进制安装tomcat 实现systemd管理控制
在不同的Linux版本中,管理服务的方式不尽相同,主要分界限在RHEL/CentOS6版本,也就是说,在CentOS6 以及之前版本中,写服务脚本,需要放在/etc/init.d/目录下,这些脚本都是bash脚本,且脚本编写较复杂。而 在CentOS7/RHEL7以及以后版本中,采用了一种叫unit的配置文件来管理服务,写服务脚本只需要按照标准格 式编写即可。
通过systemd命令集可以方便的对这些Unit进行管理。 systemd是Linux上系统守护进程管理工具,字母d(daemon)是守护进程的缩写,所以,systemd的意思就是 守护整个系统。systemd可以管理Linux系统中的所有资源,不同的资源统称为Unit,常见的unit有:
- Service unit:文件扩展名为.Service,用于定义系统服务(常用)
- Target unit:文件名扩展为.target,用于模拟实现“运行级别”
- Mount unit:文件名扩展为.mount定义文件系统挂载点。
Systemd是内核启动后的第一个用户进程,PID为1,是所有其它用户进程的父进程。
1、认识service的unit文件
扩展名:.service
service 文件存放路径:
- /etc/systemd/system/* —— 系统管理员手动软件安装包或脚本放置于此,优先级最高
- /run/systemd/system/* —— 运行时配置文件,这个目录一般是进程在运行时动态创建unit文件的目录, 一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。
- /usr/lib/systemd/system/* —— 该目录中包含的是软件包安装的单元,也就是说通过yum、dnf、rpm等软件包管理命令管理的systemd单元文件,都放置在该目录下。
- /lib/systemd/system:指向/usr/lib/systemd/system。
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/,真正的配置文件是(自动生成)存放在这个目录。
2、systemd 使用语法
systemctl [command] [unit](配置的应用名称)
command可选项:
- start:启动指定的unit systemctl start nginx
- stop:关闭指定的unit systemctl stop nginx
- restart:重启指定unit systemctl restart nginx
- reload:重载指定unit systemctl reload nginx
- enable:系统开机时自动启动指定unit,前提是配置文件中有相关配置 systemctl enable nginx
- disable:开机时不自动运行指定unit systemctl disable nginx
- status:查看指定unit当前运行状态 systemctl status nginx
3、service unit文件的例子
下面 /usr/lib/systemd/system/postfix.service 文件,它描述的是postfix服务的管理方式:
[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target
[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop
[Install]
WantedBy=multi-user.target
整个文件分三个部分,[Unit]·[Service]·[lnstal]
- [Unit]:记录unit文件的通用信息。
- [Service]:记录Service的信息
- [lnstall]:安装信息。
(1)、[Unit]部分
Description:对本service的描述
Before/After:定义启动顺序,Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxox.service,代表本服务在 xxx之后启动。
(2)、[Service]部分
Type :service的种类,包含下列几种类型:
- simple:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出,那么一切都退出
- forking:标准的启动方式。服务包含父进程和子进程,启动程序后,会调用fork()函数,通过父进程生成子进程。
- oneshot:这种服务类型就是启动完成,进程就没了。属于一次性启动。
- notify:跟simple类似,但是notify会在当前服务启动完毕,发送一个信号通知Systemd。
EnvironmentFile:环境配置文件
PIDFile:指向当前服务PID file的绝对路径
ExecStartPre:ExecStart执行前所调用的命令。
ExecStartPost:ExecStart执行后所调用的命令。
ExecStart:服务启动时执行的命令,此命令就是服务的主体。
ExecStop:定义停止当前服务时执行的命令。
注意:启动、重启、停止命令全部要求使用绝对路径
(3)、[Install]部分
WantedBy:在何种情况下,服务都可以被启用。
例如:WantedBy=multi-user.target(多用户环境下启用)
案例:
1.源码编译安装nginx 实现systemd管理控制
#1. 安装nginx编译环境
yum -y install gcc gcc-c++ openssl-devel pcre-devel gd-devel iproute net-tools telnet wget curl
wget http://nginx.org/download/nginx-1.15.5.tar.gz
tar zxf nginx-1.15.5.tar.gz &&
cd nginx-1.15.5
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module
make -j 4 && make install
#2. 通用方式启动nginx
/usr/local/nginx/sbin/nginx #启动
/usr/local/nginx/sbin/nginx -s reload #重启
/usr/local/nginx/sbin/nginx -s quit #关闭nginx
#3. systemd 管理控制启动模式
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#4. 参数详解
systemctl restart nginx
systemctl enable nginx
systemctl stop nginx
2. 二进制安装tomcat 实现systemd管理控制
#1. 下载Tomcat
wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.82/bin/apache-tomcat-8.5.82.tar.gz
#2. rpm直接安装jdk
rpm -ivh jdk-8u231-linux-x64.rpm
#3. 配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile
#4. 检测环境
java -version
#5. 安装tomcat
tar -xf apache-tomcat-8.5.82.tar.gz
mv apache-tomcat-8.5.82 /usr/local/tomcat
#6. 启动tomcat
sh /usr/local/tomcat/bin/startup.sh #启动
sh /usr/local/tomcat/bin/shutdown.sh #关闭
#7. systemd管理控制启动
vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/java/jdk1.8.0_231-amd64"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
#8. systemd 管理
systemctl restart tomcat #启动
systemctl enable tomcat #配置自启
systemctl stop tomcat #停止服务
systemctl status tomcat #检测状态