【Linux】Centos7 的 Systemctl 与 创建系统服务 (shell脚本)

news/2024/11/20 7:16:56/

Systemctl

systemctl 命令

# 启动
systemctl start NAME.service
# 停止
systemctl stop NAME.service
# 重启
systemctl restart NAME.service
# 查看状态
systemctl status NAME.service
# 查看所有激活系统服务
systemctl list-units -t service
# 查看所有系统服务
systemctl list-units -t service -a
# 设置开机自启动
systemctl enable NAME.service
# 禁止开机自启动
systemctl disable NAME.service
# 查看服务是否是开机自启动
systemctl list-unit-files –t service
# 查看某服务是否开机自启动
systemctl is-enabled NAME.service

systemctl 状态

loaded:unit配置文件已处理
active(running):一次或多次持续处理的运行
active(exited):成功完成一次性配置
active(waiting):运行中,等待一个事件
inactive:不运行
enable:开机启动
disable:开机不启动
static:开机不启动,但可以被另一个启用的服务激活。

systemctl 运行级别

0 :关机:poweroff.target
1 :单用户模式:rescue.target
2 :默认不启用NFS的多用户:multi-user.target
3 :完全的多用户:multi-user.target
4 :保留:mult-user.target
5 :图形:graphical.target
6 :重启:reboot.target

自建服务
1、服务存放路径

用户级系统服务:/usr/lib/systemd/system
系统级系统服务:/etc/systemd/system

2、编写一个系统服务

创建系统服务文件的三个部分分别是:Unit 、 Service、 Install

Unit:

Description:描述信息
After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反;
Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit即无法激活;
Wants:依赖到的其它units,弱依赖;
Conflicts:定义units间的冲突关系。

Service:

Type:定义影响ExecStart及相关参数功能的unit进程启动类型;simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中;
forking:由ExacStart启动的程序透过spawns延伸出其它子程序来作为此deamon的主要服务。原生父程序在启动结束后就会终止。
oneshot:与simple类似,不过这个程序在完成工作后就结束,不常驻内存;
dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作。因此通常也要同时设定BusName=才行;
notify:在启动完成后会发送一个通知消息。还需要配合NotifyAccess来让Systemd接收消息;
idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务。EnvironmentFile:环境配置文件;
ExecStart:指明启动unit要运行命令或脚本的绝对路径;
ExecStartPre:在ExecStart之前运行的绝对路径;
ExecStartPost:在ExecStart之后运行的绝对路径;
ExecStop:指明停止unit要运行的命令或脚本的绝对路径;
Restart:当设定Restart=1时,则当次daemon服务意外终止后,会再次自动启动。PrivateTmp:true/false表示是否给服务分配独立的临时空间
Install:
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖,强依赖;
WantedBy:被哪些units所依赖,弱依赖;
Also:安装本服务的时候还要安装别的相关服务。

举例

vim /usr/lib/systemd/system/wxybackend.service

在这里插入图片描述
:wq退出

[Unit]
Description=backend service  
After=docker.service[Service]
Type=forking
ExecStart=/home/project/xxx/syscmd.sh start
ExecReload=/home/project/xxx/syscmd.sh restart
ExecStop=/home/project/xxx/syscmd.sh stop
PrivateTmp=true[Install]
WantedBy=multi-user.target
systemctl daemon-reload 
 systemctl enable wxybackend.service 
 systemctl start wxybackend.service

syscmd.sh脚本内容

#!/bin/sh
# start 启动 stop 停止 restart 重启 status 状态
AppName=xxxx.jar
AppPath=/home/project/xxx
# JVM参数
JVM_OPTS="-Dname=$AppName  -Duser.timezone=Asia/Shanghai -Xms2048m -Xmx2048m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
APP_HOME=`pwd`
LOG_PATH=$AppPath/logs/$AppName.logif [ "$1" = "" ];
thenecho -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"exit 1
fiif [ "$AppName" = "" ];
thenecho -e "\033[0;31m 未输入应用名 \033[0m"exit 1
fifunction start()
{PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`if [ x"$PID" != x"" ]; thenecho "$AppName is running..."else#输出日志nohup java $JVM_OPTS -jar $AppPath/$AppName >> $AppPath/nohup.out 2>&1 & #不输出日志#nohup java $JVM_OPTS -jar $AppPath/$AppName  &echo "Start $AppName success..."#tail -500f nohup.outfi
}function stop()
{echo "Stop $AppName"PID=""query(){PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`}queryif [ x"$PID" != x"" ]; thenkill -TERM $PIDecho "$AppName (pid:$PID) exiting..."while [ x"$PID" != x"" ]dosleep 1querydoneecho "$AppName exited."elseecho "$AppName already stopped."fi
}function restart()
{stopsleep 2start
}function status()
{PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l`if [ $PID != 0 ];thenecho "$AppName is running..."elseecho "$AppName is not running..."fi
}case $1 instart)start;;stop)stop;;restart)restart;;status)status;;*)esac
在Linux环境下运行jar文件

方式一:
命令: java -jar xxxx.jar

   特点:当前ssh窗口被锁定,可按ctrl+c打断程序运行,或直接关闭窗口,程序退出。

方式二:
命令:java -jar xxxx.jar &

   特点:&表示在后台运行。当前ssh窗口不被锁定,但是当窗口关闭时,程序中止运行。

方式三:
命令:nohup java -jar xxxx.jar &

   特点:nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行。当用 nohup 命令执行作业时,缺省情况下该作业的所有输出被重定向到nohup.out的文件中,除非另外指定了输出文件。

方式四:
命令:nohup java -jar xxxx.jar >/log.file &

   特点:将日志输出到log.file指定的文件内。
>>      输出重定向
2>&1    (2)标准错误输出   (>) 重定向到  (&1)标准输出
2>&1 标准错误输出重定向到标准输出
&       标识进程为后台进程

shell 命令中,几个基本符号及其含义

0 表示stdin标准输入 1 表示stdout标准输出 2 表示stderr标准错误

拓展:

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中

命令改为 nohup java -jar project.jar >> log.out 2>&1 & 完美解决问题,日志追加到 log.out 文件中 ,且线程在后台不挂断运行

报错nohup找不到java
在这里插入图片描述

 看看环境变量 是不是有问题 或者 在sh脚本运行的时候 指定jdk的路径 

http://www.ppmy.cn/news/999941.html

相关文章

Delphi 开发的QR二维码生成工具,开箱即用

目录 一、基本功能: 二、使用说明: 三、操作演示gif 四、下载链接 在日常的开发中,经常需要将一个链接生成为二维码图片,特别是在进行支付开发的时候,因为我们支付后台获取了支付链接,需要变成二维码扫…

Ajax_02学习笔记(源码 + 图书管理业务 + 以及 个人信息修改功能)

Ajax_02 01_Bootstrap框架-控制弹框的使用 代码 <!-- 引入bootstrap.css --> <link href"https://cdn.jsdelivr.net/npm/bootstrap5.2.2/dist/css/bootstrap.min.css" rel"stylesheet"><button type"button" class"btn btn…

4 Promethues监控主机和容器

目录 目录 1. 监控节点 1.1 安装Node exporter 解压包 拷贝至目标目录 查看版本 1.2 配置Node exporter 1.3 配置textfile收集器 1.4 启动systemd收集器 1.5 基于Docker节点启动node_exporter 1.6 抓取Node Exporter 1.7 过滤收集器 2. 监控Docker容器 2.1 运行cAdviso…

100道Java多线程面试题(上)

线程创建方式&#xff1f; 线程有哪些基本状态? 如何停止一个正在运行的线程&#xff1f; 有三个线程T1,T2,T3,如何保证顺序执行&#xff1f; 在线程中你怎么处理不可控制异常&#xff1f; 如何创建线程池&#xff1f; 以下情况如何使用线程池&#xff1f;高并发、任务时间短;…

关于 Ubuntu 长按 shift 无效, 按 Esc 直接进入 grub 改密码的解决方法

本次长按shift没有反应&#xff0c;直接进入了系统界面&#xff0c;所以改用长按Esc键&#xff0c;步骤如下&#xff1a; 1. 长按esc&#xff0c;进入grub>提示 2.输入grub>normal &#xff0c;回车 3.上一步回车后&#xff0c;继续敲击Esc &#xff0c;出现grub界面 …

TCP连接的状态详解以及故障排查(四)

TCP连接的终止&#xff08;四次握手释放&#xff09; 由于TCP连接是全双工的&#xff0c;因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动&#xff0c;一个TCP连接在…

电磁兼容测试的条件与方法及要素

电磁骚扰源任何形式的自然或电能装置所发射的电磁能量&#xff0c;能使共享同一环境的人或其它生物受到伤害&#xff0c;或使其它设备、分系统或系统发生电磁危害&#xff0c;导致性能降低或失效&#xff0c;即称为电磁骚扰源&#xff0c;下面针对电磁兼容测试的条件与方法及要…

vue中人员导出功能实现

大纲&#xff1a; 1、导出定义的export.js文件 代码展示 import axios from axios //导出一 export const exportExcel (url, params, name, type post) > {// url url路径 params 查询参数 name 文件名 type 请求方式axios[type](url, params, {responseType: blob,}).t…