目录

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有:

  1. Service unit:文件扩展名为.Service,用于定义系统服务(常用)
  2. Target unit:文件名扩展为.target,用于模拟实现“运行级别”
  3. Mount unit:文件名扩展为.mount定义文件系统挂载点。

Systemd是内核启动后的第一个用户进程,PID为1,是所有其它用户进程的父进程。

systemd service编写 systemd编译_systemd service编写

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/,真正的配置文件是(自动生成)存放在这个目录。

systemd service编写 systemd编译_nginx_02

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]

  1. [Unit]:记录unit文件的通用信息。
  2. [Service]:记录Service的信息
  3. [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管理控制

JDK 下载官网

#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  #检测状态