一个启动脚本例子

发布于:2024-07-05 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、全部代码 

#!/bin/bash
DATE=$(date +%Y%m%d)

SOURCE="abc.jar"
TARGET="backup/abc.jar.jew.$DATE"

if [ -f "$SOURCE" ]; then
    cp "$SOURCE" "$TARGET"
fi

rm -f abc.jar
mv abc_1.jar abc.jar

pidNum=`ps -ef | grep $SOURCE | grep -v "grep"|awk '{print $2}'`
if [ "$pidNum" = "" ];then
	echo "not"
else
	echo "pid : $pidNum"
	kill -15 $pidNum
	echo "successfully"
fi

nohup java -jar abc.jar > log.file 2>&1

二、分析

后端语言:java        新jar包名字:abc_1.jar        老jar包(被替换jar包):abc.jar

目的:首先判断后端的abc.jar是否存在,如果存在,那就把这个jar复制并加当前时间命名后作为备份,放到备份文件夹里。删除abc.jar,把新jar包abc_1.jar重命名为abc.jar。停掉进程后,重新启动。

---------------------------------------------------------------------------------------------------------------------------------

#!/bin/bash
DATE=$(date +%Y%m%d)        #输出当前日期,赋值给DATE变量,格式为20240627

SOURCE="abc.jar"        #当前jar名字赋值SOURCE变量
TARGET="backup/abc.jar.jew.$DATE"        #backup路径下abc.jar加当前日期后缀,备份

if [ -f "$SOURCE" ]; then        #如果SOURCE存在(-f:判断后边的路径是否是一个常规文件)
    cp "$SOURCE" "$TARGET"        #将SOURCE复制到TARGET,后缀有当前日期
fi        #语句结尾

rm -f abc.jar        #强制删除abc.jar
mv abc_1.jar abc.jar        #将abc_1.jar重命名为abc.jar 

pidNum=`ps -ef | grep $SOURCE | grep -v "grep"|awk '{print $2}'`

#ps -ef :查看正在运行的所有进程的完整信息;|:在这个结果的基础上;grep $SOURCE:查找文件里含有SOURCE(abc.jar)的信息;|:在这个结果的基础上;grep -v "grep":查找并去掉含有grep的进程;|:在这个结果的基础上;awk '{print $2}':格式化文本信息,输出第二个字段值,也就是进程号,赋值给pidNum。
if [ "$pidNum" = "" ];then        #如果进程号为空
    echo "not"        #输出not,就证明当前没有进程运行,可以直接启动
else        #不为空,有进程运行
    echo "pid : $pidNum"        #输出进程号
    kill -15 $pidNum        #退出进程
    echo "successfully"        #提示退出进程成功
fi        #语句结尾

nohup java -jar abc.jar > log.file 2>&1       

#nohup:确保进程登出或会话关闭后仍然运行java程序。java -jar abc.jar:运行java应用程序。 >:重定向输出。log.file:将被重定向到的文件。 2>&1:将标准错误重定向到标准输出的同一个地方(log.file),这样就可以将错误和信息都记录到同一个文件中。也可以最后多加一个&表示将命令放入后台运行。

---------------------------------------------------------------------------------------------------------------------------------

三、关于2>&1的问题

2是标准错误输入,1是标准输出。>&是一个整体,不能分开使用,否则就不是这个含义了。

还有 log.file、2、1的排列顺序,不能打乱:

> log.file 2>&1 含义:1本来指向屏幕,执行> log.file,1指向 log.file;执行2>&1,2指向1,而1指向 log.file,所以1和2都指向log.file。此时1和2都指向log.file

2>&1 > log.file 含义:1本来指向屏幕,执行2>&1,2指向1,而1指向屏幕,所以1和2都指向屏幕;执行> log.file,1指向log.file。此时只有1指向了log.file。(所以这样就会导致有错误输出的时候log.file没有记录!!!)