Centos7&8手动添加系统服务

时间:2021-10-19    作者:冰城心无泪    分类: Linux基础


简单介绍

Systemd 是 Linux 系统工具,systemctl是systemd的管理控制工具,用来启动守护进程,
从centos7开始,systemd成为了系统的默认启动守护进程,当然也包括Centos8.

手动创建系统服务的常用范围:编译安装的应用,如编译安装的redis、Nginx及自写的shell脚本

点此查看CentOS7&8编译安装Nginx
优点:管理方便,不用记录复杂的路径及命令,用简单的命令 systemctl start/stop service-name 即可启动或停止,
systemctl enable/disable service-name 即可管理是否开机启动

Systemd 默认从目录/etc/systemd/system/读取配置文件,因此,我们可以直接把做好的系统服务脚本放在此目录。
要注意的是,/etc/systemd/system/大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,这个知道一下就好。

service文件的格式说明:service文件的格式说明:

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

[Unit] #部分主要是对这个服务的说明,常用的有以下几点[Unit] #部分主要是对这个服务的说明,常用的有以下几点
Description= #用于描述服务,如 WEB Server

After=       #用于表明在某些服务后启动,如 network.target,可以有多个,空格隔开。相应地,还有一个Before,与之相反。
            这里只涉及启动顺序,不涉及依赖关系。说白了就是,不管你在我之前还是之后启动,不管你能不能启动,我都启动。
Requires=    #当前 Unit 依赖的其他 Unit。就是说,我启动之前要看看你,你启动失败的话,我就算能启动我也不会启动。
         #非业务强制需要,只用After或者Before即可

[Service]    #这部分是关键,是服务的一些具体运行参数的设置.其中的启动、重启、停止命令全部要求使用绝对路径。常用参数如下

Type=simple  #省略Type指令时的默认值,执行ExecStart指定的命令,启动主进程,只适合在shell下运行在前台的命令。
Type=forking #是后台运行的形式,
Type=notify  #当前服务启动完毕,会通知Systemd,再继续往下执行
            #以上根据需要选一个,常用的是simple和forKing

User=users   #是设置服务运行的用户,这行不写行不行?  行!!!
Group=users  #是设置服务运行的用户组,这行不写行不行?  行!!!
PIDFile=     #为存放PID的文件路径,这行不写行不行?如果是shell脚本的话,不写也没事
ExecStart=   #为服务的具体运行命令,这行不写行不行?这个真不行。
ExecReload=   #为重启命令,这行不写行不行?   行!!!
ExecStop=     #为停止命令,这行不写行不行?这个真不行。
PrivateTmp=True #表示给服务分配独立的临时空间,这行不写行不行? 你给我写上!!!

[Install]    #定义本服务在设置服务开机自启动时相关的属性。
            这一配置段不是必须的,只有在创建/移除服务配置文件的软链接时,Install段才会派上用场。
            但系统服务在设置开机自启动或禁止开机自启动就会创建/移除服务配置文件的软链接。
            我制作服务脚本的目的就是方便的管理开机自启动或禁止开机自启动,因此,这里要配置。一般只配置一个WantedBy指令。
WantedBy=multi-user.target #将在/etc/systemd/multi-user.target.wants目录下创建本服务的软链接。

实例1:服务用于开机运行Nginx项目:

编写服务脚本

vi /etc/systemd/system/nginx.service
内容如下:

[Unit]
Description=nginx -  web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/Nginx/logs/nginx.pid
ExecStartPre=/Nginx/sbin/nginx -t -c /Nginx/conf/nginx.conf
ExecStart=/Nginx/sbin/nginx -c /Nginx/conf/nginx.conf
ExecReload=/Nginx/sbin/nginx -s reload
ExecStop=/Nginx/sbin/nginx -s stop
ExecQuit=/Nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

实例2:服务用于开机启动jar包.

2.1 编写服务脚本,比较笨的方法

vi /usr/lib/systemd/system/java-jar.service

内容如下

[Unit]
Description=java - jar
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/java/startjar.sh
ExecStop=/java/stopjar.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启动脚本startjar.sh内容如下:

#!/bin/sh
cd /java/ && nohup java -jar standard-0.0.1-SNAPSHOT.jar > /java/jarnohup.log 2>&1 &
echo $! > /java/jar-server.pid

停止脚本stopjar.sh内容如下:

#!/bin/sh
javaPID=`cat /java/jar-server.pid`
kill -9 $javaPID

2.2 当然,也可以用case语句编写服务脚本,本人也建议用这种方法,只需要一个脚本即可

vi /usr/lib/systemd/system/java-jar.service

内容如下

[Unit]
Description=java - jar
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/java/java-jar.sh start
ExecStop=/java/java-jar.sh stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启动停止脚本java-jar.sh内容如下:

Java_pid=$(ps -ef | grep -w standard-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}')
Start_java() {
    if [ -z $Java_pid ]
        then
            cd /java/ && nohup java -jar standard-0.0.1-SNAPSHOT.jar > /java/jarnohup.log 2>&1 &
}

Stop_java() {
    for pid in $Java_pid
    do
    kill -9 $pid
    done
}

case $1 in
 start)
 Start_java
;;
stop)
Stop_java
;;
restart)
Stop_java && Start_java
;;
esac

注意事项

当服务文件保存后,一定要做的,重载系统配置文件,要不启动不起来,系统也会提示你重载一下。

systemctl daemon-reload

添加可执行权限(我是root,我没加,服务跑的哇哇快,你还是加上吧):

chmod 755 /etc/systemd/system/nginx.service

设置为开机自启动,以nginx为例,启动jar包服务脚本方法相同:

systemctl enable nginx.service

启动nginx服务

systemctl start nginx.service

检查服务状态

systemctl status nginx.service

取消开机自动启动

systemctl disable nginx.service

显示所有已启动的服务

systemctl list-units --type=service