一、全部代码
#!/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没有记录!!!)