一、启动jar包

nohup java -jar demo-0.0.1-SNAPSHOT.jar > spring.log 2>&1&

上述命令会使jar包在后台运行,用户退出也不会终止程序。
其中:末尾的&,使用指定后台运行nohup命令表示,系统后台不挂断地运行命令,退出终端不会影响程序的运行。不加这个命令,即使使用&,在退出远程连接后还是终止程序。
jar包后面>spring.log,是nohup的相关命令,表示将原本会打印在控制台的文件打印到spring.log里。该文件如果未指定路径,会在当前目录生成。
2>&1,同样是nohup相关,表示将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文件中。如果不加这一命令会生成提示:nohup: ignoring input and redirecting stderr to stdout
注意:>意思是创建,>>是追加。

二、查看日志

1.实时查看日志
tail命令 用于显示文本文件的末尾内容(默认10行,相当于增加参数 -n 10),并且实时不断有内容被打印出来,若想中断进程,使用命令 Ctrl-C(比较吃内存)

参数:
tail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [ File ] 
 
参数解释:
-f 该参数用于监视File文件增长。 
-c Number 从 Number 字节位置读取指定文件 
-n Number 从 Number 行位置读取指定文件。 
-m Number 从 Number 多字节字符位置读取指定文件,比方你的文件假设包括中文字,假设指定-c参数,可能导致
   截断,但使用-m则会避免该问题。 
-b Number 从 Number 表示的512字节块位置读取指定文件。 
-k Number 从 Number 表示的1KB块位置读取指定文件。 
 
File 指定操作的目标文件名称 
上述命令中,都涉及到number,假设不指定,默认显示10行。Number前面可使用正负号,表示该偏移从顶部还是从尾
  部开始计算。 
 
tail 可运行文件一般在/usr/bin/以下。
 
tail -f XXX.log 监视XXX.log文件的尾部内容(默认10行,相当于增加参数 -n 10)
tail -100f XXX.log  监视XXX.log文件的尾部内容(默认从底部往前100行,相当于增加参数 -n 100)
tail -n 20 XXX.log 显示XXX.log最后20行
tail -r -n 10 XXX.log 逆序显示XXX.log最后10行

2.搜索关键字附近的日志
cat -n XXX.log |grep “关键字”

-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting
-E --show-ends 在每行结束处显示 $
-e --等价于-vE
 
常用的命令
cat XXX.log | grep -C 5 '关键字'   (显示日志里匹配字串那行以及前后5行)
cat XXX.log | grep -B 5 '关键字'   (显示匹配字串及前5行)
cat XXX.log | grep -A 5 '关键字'   (显示匹配字串及后5行)

三、停止jar包

1 根据端口号获取进程编号PID

netstat -lnp|grep 端口号

image-1652942773475

2.根据jar包名称获取进程编号PID

ps aux|grep jar包名称

1652943005(1)

3. 根据PID杀死进程

kill -9 PID

四、在linux中发布jar包.sh脚本

1.脚本

可直接复制后放入linux中 后缀改成 .sh 。执行方法有两种
1、直接./加上文件名.sh,如运行hello.sh为./hello.sh【hello.sh必须有x权限】
2、直接sh 加上文件名.sh,如运行hello.sh为sh hello.sh【hello.sh可以没有x权限】

#!/bin/bash  
#这里可替换为你自己的jar包名称,其他代码无需更改  
APP_NAME=XXXXX.jar
  
#使用说明,用来提示用户输入参数  
usage() {  
    echo "Usage: sh start.sh [启动:start|停止:stop|重启:restart|状态:status]"  
    exit 1  
}  
  
#检查程序是否在运行  
is_exist() {   
    pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}' `  
    #如果不存在返回1,存在返回0  
    if [ -z "${pid}" ]; then  
      return 1  
    else  
      return 0  
    fi  
}  
  
#启动方法  
start() {  
   is_exist  
   if [ $? -eq "0" ]; then  
     echo "${APP_NAME} is already running. pid=${pid} ."  
   else  
     nohup java -jar $APP_NAME > ./journal.log 2>&1 &  
   fi  
}  
  
#停止方法  
stop() {  
   is_exist  
   if [ $? -eq "0" ]; then  
     kill -9 $pid  
   else  
     echo "${APP_NAME} is not running"  
   fi  
}  
  
#输出运行状态  
status() {  
   is_exist  
   if [ $? -eq "0" ]; then  
     echo "${APP_NAME} is running. Pid is ${pid}"  
   else  
     echo "${APP_NAME} is not running."  
   fi  
}  
  
#重启  
restart() {  
   stop  
   start  
}  
  
#根据输入参数,选择执行对应方法,不输入则执行使用说明  
case "$1" in  
   "start")  
     start  
     ;;  
   "stop")  
     stop  
     ;;  
   "status")  
     status  
     ;;  
   "restart")  
     restart  
     ;;  
   *)  
     usage  
     ;;  
esac  

2.如果复制移动到linux中执行后报错:Command not found 从两方面解决

1、是Windows和Linux的.sh脚本文件格式不同windows 下的换行符是\r\n,而 linux 下的换行符是\n,没有识别/r,这个属于脚本编码的问题,如果在脚本中有空行,并且是在Windows下进行编辑之后上传到linux上去执行的话,就会出现这个问题。
在start.sh对应脚本目录下,执行以下命令即可。

vim start.sh   -- 根据提示选择首字母进入文件编辑状态(键盘E)
:set ff=unix   --直接输入:冒号后,命令行会自动跳至最后一行进行编辑
:wq            --保存文件并退出,w写入q退出

2.确保用户对文件有读写及执行权限(如果此时的权限是 dr,没有x,就说明没有执行的权限)

chmod a+x *.sh   -- 同样在start.sh对应脚本目录下,执行以下命令即可