shell脚本基本编写

shell脚本基本编写

shell脚本写好对运维来说是非常有帮助的,例如:在一个文件夹中全部存放启动脚本或者停止脚本。将无数jar包分别上传到指定目录中,直接执行一个命令全部jar启动了,就没有比较每个 jar都需要去执行一次。docker中的容器亦是如此,数据库,elk,redis等等。只要写好shell脚本,可以避免掉没有比较的工作压力。

一、语法入门

1.1、出语句

## 输出语句并换行
echo 需要输出的语句
## 输出语句不换行
printf 您好

输出的内容可以使用 单引号,双引号,不用引号都OK

1.2、 #!/bin/sh#!/bin/bash的区别

该语句大多出现在启动文件中,每个启动文件的第一行都喜欢带上这样的语句。

#!/bin/sh当启动文件中出现错误是,就不执行一下语句。

#!/bin/sh
source pcy.sh #pcy.sh并不存在
echo hello

这里并不会输出任何语句

#!/bin/bash当启动文件中出现错误是,继续执行一下语句

#!/bin/bash
source pcy.sh #pcy.sh并不存在
echo hello

利用 ./start.sh启动

会打印处 hello

如果使用 sh start.sh启动,不会答应处 hello信息。

总结: #!bin/sh 遵循posix特定规范,而 #!bin/bash不会遵循。但是使用 sh start.sh命令启动,效果和 #!bin/sh效果一样的, 遵循posix的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释” 。

二、shell写jar的启动命令

参考博客:https://www.cnblogs.com/youxiu326/p/shell_run.html

#!/bin/bash
 
APP_NAME=back-web.jar  # 这里指定jar包名称
 
usage() {
    echo "case: sh run.sh [start|stop|restart|status]"
    echo "请类似这样执行 ./*.sh start   or  ./*sh restart"
    exit 1
}
 
# 判断当前服务是否已经启动的函数
is_exist(){
    echo "执行 is_exist 方法"
    pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' ` #根据ps 命令查询当前服务的进程号 赋值给pid"
    if [ -z "${pid}" ]; then #判断pid是否为空
        echo "pid 等于null"
        return 1
    else
        echo "pid 不等于null"
        return 0
    fi
}
 
 
start(){
    is_exist
    if [ $? -eq "0" ]; then    # [$? -eq "0"] 说明pid不等于空 说明服务正在运行中,将进程号打印出来
        echo "${APP_NAME} running. pid=${pid}"
    else
        nohup java -jar /usr/local/data/$APP_NAME > log.file 2>log.error &  # 说明pid为空 执行java -jar 命令启动服务
        echo "${APP_NAME} started"
    fi
}
 
 
stop(){
    echo "执行 stop 方法"
    is_exist
    if [ $? -eq "0" ]; then    # [$? -eq "0"] 说明pid不等于空 说明服务正在运行中,将进程号杀死
        kill -9 $pid
        echo "${pid} stopped"
    else
        echo "${APP_NAME} not running"
    fi
}
 
 
status(){
    echo "执行 status 方法"
    is_exist
    if [ $? -eq "0" ]; then
        echo "${APP_NAME} running. Pid is ${pid}"
    else
        echo "${APP_NAME} not running"
    fi
}
 
 
# 重启命令其实就是先执行关闭命令 再执行重启命令
restart(){
    stop
    start
}
 
 
# 这里的$1 取的是当前输入命令 的第二个参数 ./start.sh start
case "$1" in
    "start")
        start
        ;;
    "stop")
        stop
        ;;
    "status")
        status
        ;;
    "restart")
        restart
        ;;
    *)
    usage
    ;;
esac

注意:APP_NAME=back-web.jar 这里只能指定jar名称,如果指定绝对路径加上名称,那么获取端口的时候,获取端口可能会存在问题。

启动jar命令时

nohup java -jar /usr/local/data/$APP_NAME > log.file 2>log.error & # 说明pid为空 执行java -jar 命令启动服务

这里可以需要指定jar包所在的绝对路径,但是不能指定jar名称,因为上面变量中已经指定了。 后面的日志或者异常日志信息可以更改,如果不更改,上面的写法是存放在当前目录下。

**特别注意:**当前只是启动一个jar,如果启动多个jar时,需要在定义 APP_NAME变量,分别在 is_exist()start()stop()status()中更改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值