时间: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结尾,一般会分为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目录下创建本服务的软链接。
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
[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
#!/bin/sh
cd /java/ && nohup java -jar standard-0.0.1-SNAPSHOT.jar > /java/jarnohup.log 2>&1 &
echo $! > /java/jar-server.pid
#!/bin/sh
javaPID=`cat /java/jar-server.pid`
kill -9 $javaPID
[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_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
chmod 755 /etc/systemd/system/nginx.service
systemctl enable nginx.service
systemctl start nginx.service
systemctl status nginx.service
systemctl disable nginx.service
systemctl list-units --type=service