Linux使用Systemd管理进程服务
systemd介绍
systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。所以从CentOS 7开始也由systemd取代了init作为默认的系统进程管理工具
systemd所管理的所有系统资源都称作Unit,通过systemd命令集可以方便的对这些Unit进行管理。比如systemctl、hostnamectl、timedatectl、localctl等命令,这些命令虽然改写了init时代用户的命令使用习惯(不再使用chkconfig、service等命令),但确实也提供了很大的便捷性
systemd特点
- 最新系统都采用systemd管理(RedHat7,CentOS7,Ubuntu15…)
- CentOS7 支持开机并行启动服务,显著提高开机启动效率
- CentOS7关机只关闭正在运行的服务,而CentOS6,全部都关闭一次
- CentOS7服务的启动与停止不再使用脚本进行管理,也就是/etc/init.d下不在有脚本
- CentOS7使用systemd解决原有模式缺陷,比如原有service不会关闭程序产生的子进程
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
systemd配置文件说明
- 每一个 Unit 都需要有一个配置文件用于告知 systemd 对于服务的管理方式
- 配置文件存放于 /usr/lib/systemd/system/,设置开机启动后会在 /etc/systemd/system 目录建立软链接文件
- 每个Unit的配置文件配置默认后缀名为.service
- 在 /usr/lib/systemd/system/ 目录中分为 system 和 user 两个目录,一般将开机不登陆就能运行的程序存在系统服务里,也就是/usr/lib/systemd/system
- 配置文件使用方括号分成了多个部分,并且区分大小写
systemd实战案例
systemd管理nginx
源码编译安装nginx 实现systemd管理控制
安装nginx编译环境
[root@VM-12-17-centos ~]# yum install gcc pcre-devel openssl-devel zlib-devel -y
[root@VM-12-17-centos ~]# wget http://nginx.org/download/nginx-1.18.4.tar.gz
[root@VM-12-17-centos ~]# tar zxf nginx-1.18.4.tar.gz &&cd nginx-1.18.4
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
–with-stream
[root@VM-12-17-centos ~]# make && make install
通用方式启动nginx
#启动
[root@VM-12-17-centos ~]# /usr/local/nginx/sbin/nginx
#重启
[root@VM-12-17-centos ~]# /usr/local/nginx/sbin/nginx -s reload
#关闭nginx
[root@VM-12-17-centos ~]# /usr/local/nginx/sbin/nginx -s quit
systemd管理启动
[root@VM-12-17-centos ~]# 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
[root@VM-12-17-centos ~]# systemctl daemon-reload
[root@VM-12-17-centos ~]# systemctl start nginx
[root@VM-12-17-centos ~]# systemctl enable nginx
[root@VM-12-17-centos ~]# systemctl stop nginx
systemd管理tomcat
二进制安装tomcat实现systemd管理控制
安装java环境
[root@VM-12-17-centos ~]# rpm -ivh jdk-8u231-linux-x64.rpm
[root@VM-12-17-centos ~]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
安装tomcat
[root@VM-12-17-centos ~]# tar xf apache-tomcat-8.5.4.tar.gz
[root@VM-12-17-centos ~]# mv apache-tomcat-8.5.4 /usr/local/tomcat
#启动tomcat
[root@VM-12-17-centos ~]# sh /usr/local/tomcat/bin/startup.sh
#关闭tomcat
[root@VM-12-17-centos ~]# sh /usr/local/tomcat/bin/shutdown.sh
systemd管理启动
[root@VM-12-17-centos ~]# 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_221-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
#启动
[root@VM-12-17-centos ~]# systemctl start tomcat
#配置自启
[root@VM-12-17-centos ~]# systemctl enable tomcat
#停止服务
[root@VM-12-17-centos ~]# systemctl stop tomcat
#检测状态
[root@VM-12-17-centos ~]# systemctl status tomcat
上述两个服务nginx和tomcat程序中自带了启动停止脚本,如果启动得程序没有自带脚本则需要自己编写一个类似得启动停止脚本
systemd管理jar启动文件
部署jar程序 实现systemd管理控制,实际项目中会有一些jar程序需要启动 如果手动启动则需要输入一大串命令,停止则需要杀掉进程来停止很麻烦,如下report的jar包启动
[root@VM-12-17-centos ~]# java -jar report.jar -Dconfig=/home/application.properties
编写启动脚本
[root@VM-12-17-centos ~]# vim report.sh
#!/bin/bash
source /etc/profile
jarName="report.jar"
workDir="/usr/local/report"
start(){
cd ${workDir} && java -jar ${jarName} --spring.profiles.active=prod --server.port=8088 >uams.log 2>&1 &
}
stop(){
ps -ef | grep -qP "(?<=-jar)\s+${jarName}" && kill $(ps -ef | grep -P "(?<=-jar)\s+${jarName}" | awk '{print $2}')
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
esac
systemd管理启动
[root@VM-12-17-centos ~]# vim /usr/lib/systemd/system/report.service
[Unit]
Description=report server
Wants=network-online.target
After=network.target
[Service]
Type=forking
WorkingDirectory=/usr/local/report/
ExecStart=/bin/bash report.sh start
ExecStop=/bin/bash report.sh stop
ExecReload=/bin/bash report.sh restart
Restart=on-failure
[Install]
WantedBy=multi-user.target
#启动
[root@VM-12-17-centos ~]# systemctl restart report
#配置自启
[root@VM-12-17-centos ~]# systemctl enable report
#停止服务
[root@VM-12-17-centos ~]# systemctl stop report
#检测状态
[root@VM-12-17-centos ~]# systemctl status report
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
爱吃可爱多!
喜欢就支持一下吧
打赏
微信
支付宝