Linux -- 07 -- 编写Shell项目启动脚本

原文链接:Linux – 07 – 编写Shell项目启动脚本


相关文章:


在日常开发中,我们经常会将项目打成 jar 包,部署到服务器上运行,但每次启动项目都要使用 jar -jar 命令,停止项目还需要先查找程序进程 pid,然后再进行 kill。如果只是部署一两次,手动操作没有什么多大问题,要是需要经常重新部署,每次输入命令也是挺麻烦的,因此我们可以通过编写 shell 脚本来解决这个问题


一、编写 shell 脚本

  • 首先我们需要一个可运行的项目 jar 包,将其部署到服务器上 (springboot-0.0.1-SNAPSHOT.jar)

  • 然后我们再来编写 shell 脚本 (sh 名称为 run.sh),如下所示

    #!/bin/bash
    
    #项目路径
    APP_NAME=springboot-0.0.1-SNAPSHOT.jar
    #配置文件路径
    APP_CONF=application.yml
    
    #使用说明,用来提示输入参数
    usage() {
    	echo "Usage: run.sh {start|stop|restart|status}"
    	exit 1
    }
    
    #检查程序是否正在运行
    is_running() {
    	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_running
    	if [ $? -eq 0 ];
    	then
    		echo "${APP_NAME} is already running, pid=${pid}"
    	else
    		nohup java -jar ${APP_NAME} --spring.config.location=${APP_CONF} > nohup.out 2>&1 &
    	fi
    }
    
    #停止
    stop() {
    	is_running
    	if [ $? -eq 0 ];
    	then
    		kill -9 $pid
    	else
    		echo "${APP_NAME} is not running"
    	fi
    }
    
    #查看运行状态
    status() {
    	is_running
    	if [ $? -eq 0 ];
    	then
    		echo "${APP_NAME} is running, pid is ${pid}"
    	else
    		echo "${APP_NAME} is not running"
    	fi
    }
    
    #重启
    restart() {
    	stop
    	sleep 5
    	start
    }
    
    #根据输入的参数,选择对应的执行方法,不输入则执行使用说明
    case "$1" in
    	start)
    		start
    		;;
    	stop)
    		stop
    		;;
    	status)
    		status
    		;;
    	restart)
    		restart
    		;;
    	*)
    		usage
    		;;
    esac
    
  • 编写好之后,我们赋予其可执行权限 chmod +x run.sh,就可以使用了

    命令作用
    ./run.sh start启动程序
    ./run.sh stop关闭程序
    ./run.sh status查看程序运行状态
    ./run.sh restart重启程序

二、语法解析

  • Linux 退出状态码

    状态码描述
    0命令成功结束
    1通用未知错误
    2误用 shell 命令
    126命令不可执行
    127没找到命令
    128无效退出参数
    128+xLinux 信号 x 的严重错误
    130命令通过 Ctrl+C 终止
    255退出状态码越界
  • 标准输入输出

    状态码描述
    0标准输入 (stdin)
    1标准输出 (stdout)
    2标准错误 (stderr)
  • shell 语句解析

    • ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'

      • ps -ef|grep $APP_NAME

        • 用于查看当前程序的进程信息
      • grep -v grep

        • 用于显示不包含 grep 的所有行
      • awk '{print $2}'

        • 对文本数据进行处理,打印第二列数据 (第二列数据为进程 pid)
    • if [ -z "${pid}" ]

      • -z

        • 判断字符串是否为空,如果为空,则为 true;如果不为空,则为 false
      • -n

        • 判断字符串是否不为空,如果为空,则为 false;如果不为空,则为 true
    • nohup java -jar ${APP_NAME} > nohup.out 2>&1 &

      • nohup java -jar ${APP_NAME}

        • 启动程序
      • nohup.out 2>&1 &

        • 将正常输出和错误输出都输出到 nohup.out 文件中

        • 在 > 左边的 2,表示标准错误 (stderr),不需要加 &

        • 在 > 右边的 1 必须加 &,才能表示标准输出 (stdout);如果不加,则表示的是文件名


三、异常解析

  • 如果是在 Windows 下编辑好脚本,再上传到 linux 上运行的话,会报以下异常
    在这里插入图片描述

  • 这是因为 Windows 和 Linux 下的换行回车格式不同,Windows 下的格式为 dos,Linux 下的格式为 unix,因此我们需要进行格式转换

    • 在 vim 命令模式中,我们可以使用 :set ff 命令来查看当前文件的 format 格式 (此时为 dos)

    • 然后通过 :set ff=unix 命令将 dos 修改为 unix,保存并退出 (此时为 unix)

  • 此时我们再启动脚本,就不会有问题了


四、参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值