shell自动化脚本,启动、停止应用程序及shell脚本开机自启动设置

编写脚本内容如下:

#!/usr/bin/env bash

# 常量初始化
set_runtime_vars(){
    # 日期时间
    Now_Date=`date +"%Y-%m-%d %H:%M:%S"`
    
    # 服务状态
    Service_Status=(
        "服务已开启"
        "服务已停止"
    )
    
    # 动作状态
    Action_Status=(
        "服务启动成功"
        "服务停止成功"
        "服务启动失败"
        "服务停止失败"
    )
    
    # 程序名称
    App_Name=(
        "------Java-----"
        "------.Net-----"
        "------Node-----"
        "-----Python----"
        "------Web------"
        "--Java数据模拟--"
        "--.Net数据模拟--"
    )
    
    # 线程名称
    Thread_Name=(
        "java -javaagent:/home/ymliu/Skywalking/Agent/demo_java_linux/ShinyAPM-agent/ShinyAPM-agent.jar -jar /home/ymliu/Skywalking/Agent/demo_java_linux/spring-boot-jpa-thymeleaf-curd-3.0.0.jar"  # java程序在线程中的名称
        "dotnet demo2.dll --environment=Development"  # .net程序在线程中的名称
        "node web.js"  # node程序在线程中的名称
        "python manage.py runserver"  # python程序在线程中的名称
        "dotnet demo_web.dll"  # web程序在线程中的名称
        "DataGenerator.sh"  # Java数据模拟程序在线程中的名称
        "python DataGenerator.py"  # .net数据模拟程序在线程中的名称
    )
    
    # 日志文件
    File_Name=$Script_Dir/start.log
}

# 获取线程数量
Get_Thread_Num(){
    thread_Name=$1
    num=`ps -ef | grep "${thread_Name}" | grep -v grep | wc -l`
}

# 获取线程ID
Get_Thread_ID(){
    thread_Name=$1
    pid=`ps -ef | grep "${thread_Name}" | grep -v grep | awk '{print $2}'`
}

# 检查Java服务状态
Check_Java_Status(){
    Get_Thread_Num "${Thread_Name[0]}"
    Get_Thread_ID "${Thread_Name[0]}"
    
    if [[ $num > 0 && $pid!=null ]]; then
        echo "${App_Name[0]}${Service_Status[0]}"
    else
        echo "${App_Name[0]}${Service_Status[1]}"
    fi
}

# 检查.net服务状态
Check_Net_Status(){
    Get_Thread_Num "${Thread_Name[1]}"
    Get_Thread_ID "${Thread_Name[1]}"
    
    if [[ $num > 0 && $pid!=null ]]; then
        echo "${App_Name[1]}${Service_Status[0]}"
    else
        echo "${App_Name[1]}${Service_Status[1]}"
    fi
}

# 检查node服务状态
Check_Node_Status(){
    Get_Thread_Num "${Thread_Name[2]}"
    Get_Thread_ID "${Thread_Name[2]}"
    
    if [[ $num > 0 && $pid!=null ]]; then
        echo "${App_Name[2]}${Service_Status[0]}"
    else
        echo "${App_Name[2]}${Service_Status[1]}"
    fi
}

# 检查python服务状态
Check_Python_Status(){
    Get_Thread_Num "${Thread_Name[3]}"
    Get_Thread_ID "${Thread_Name[3]}"
    
    if [[ $num > 0 && $pid!=null ]]; then
        echo "${App_Name[3]}${Service_Status[0]}"
    else
        echo "${App_Name[3]}${Service_Status[1]}"
    fi
}

# 检查web服务状态
Check_Web_Status(){
    Get_Thread_Num "${Thread_Name[4]}"
    Get_Thread_ID "${Thread_Name[4]}"
    
    if [[ $num > 0 && $pid!=null ]]; then
        echo "${App_Name[4]}${Service_Status[0]}"
    else
        echo "${App_Name[4]}${Service_Status[1]}"
    fi
}

# 检查Java数据模拟服务状态
Check_JavaData_Status(){
    Get_Thread_Num "${Thread_Name[5]}"
    Get_Thread_ID "${Thread_Name[5]}"
    
    if [[ $num > 0 && $pid!=null ]]; then
        echo "${App_Name[5]}${Service_Status[0]}"
    else
        echo "${App_Name[5]}${Service_Status[1]}"
    fi
}

# 检查.net数据模拟服务状态
Check_NetData_Status(){
    Get_Thread_Num "${Thread_Name[6]}"
    Get_Thread_ID "${Thread_Name[6]}"
    
    if [[ $num > 0 && $pid!=null ]]; then
        echo "${App_Name[6]}${Service_Status[0]}"
    else
        echo "${App_Name[6]}${Service_Status[1]}"
    fi
}

# 启动Java程序
Start_Java_App(){
    if [[ $(Check_Java_Status) == "${App_Name[0]}${Service_Status[0]}" ]]; then
        echo "${App_Name[0]}${Service_Status[0]}"
    else
        cd $Script_Dir/demo_java_linux
        nohup ./start.sh & # 启动程序的命令
        Get_Thread_ID "${Thread_Name[0]}"
        if [[ $(Get_Thread_ID "${Thread_Name[0]}") != null ]]; then
            echo "${App_Name[0]}${Action_Status[0]}"
            echo "${Now_Date}:${App_Name[0]}应用服务启动成功,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[0]}${Action_Status[2]}"
            echo "${Now_Date}:${App_Name[0]}应用服务启动失败" >> $File_Name # 把时间、应用名称写入日志
        fi
    fi
}

# 启动net程序
Start_Net_App(){
    if [[ $(Check_Net_Status) == "${App_Name[1]}${Service_Status[0]}" ]]; then
        echo "${App_Name[1]}${Service_Status[0]}"
    else
        cd $Script_Dir/demo_net_linux
        nohup ./start.sh & # 启动程序的命令
        if [[ $(Get_Thread_ID "${Thread_Name[1]}") != null ]]; then
            echo "${App_Name[1]}${Action_Status[0]}"
            echo "${Now_Date}:${App_Name[1]}应用服务启动成功,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[1]}${Action_Status[2]}"
            echo "${Now_Date}:${App_Name[1]}应用服务启动失败" >> $File_Name # 把时间、应用名称写入日志
        fi
    fi
}

# 启动node程序
Start_Node_App(){
    if [[ $(Check_Node_Status) == "${App_Name[2]}${Service_Status[0]}" ]]; then
        echo "${App_Name[2]}${Service_Status[0]}"
    else
        cd $Script_Dir/demo_node_linux
        nohup ./start.sh & # 启动程序的命令
        if [[ $(Get_Thread_ID "${Thread_Name[2]}") != null ]]; then
            echo "${App_Name[2]}${Action_Status[0]}"
            echo "${Now_Date}:${App_Name[2]}应用服务启动成功,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[2]}${Action_Status[2]}"
            echo "${Now_Date}:${App_Name[2]}应用服务启动失败" >> $File_Name # 把时间、应用名称写入日志
        fi
    fi
}

# 启动python程序
Start_Python_App(){
    if [[ $(Check_Python_Status) == "${App_Name[3]}${Service_Status[0]}" ]]; then
        echo "${App_Name[3]}${Service_Status[0]}"
    else
        cd $Script_Dir/demo_python/mysite
        source venv/bin/activate # 启动python虚拟环境
        nohup ./feizhuru_start.sh & # 启动程序的命令
        if [[ $(Get_Thread_ID "${Thread_Name[3]}") != null ]]; then
            echo "${App_Name[3]}${Action_Status[0]}"
            echo "${Now_Date}:${App_Name[3]}应用服务启动成功,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[3]}${Action_Status[2]}"
            echo "${Now_Date}:${App_Name[3]}应用服务启动失败" >> $File_Name # 把时间、应用名称写入日志
        fi
    fi
}

# 启动web程序
Start_Demo_Web(){
    if [[ $(Check_Web_Status) == "${App_Name[4]}${Service_Status[0]}" ]]; then
        echo "${App_Name[4]}${Service_Status[0]}"
    else
        cd $Script_Dir/demo_web
        nohup ./start.sh & #启动程序的命令
        if [[ $(Get_Thread_ID "${Thread_Name[4]}") != null ]]; then
            echo "${App_Name[4]}${Action_Status[0]}"
            echo "${Now_Date}:${App_Name[4]}应用服务启动成功,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[4]}${Action_Status[2]}"
            echo "${Now_Date}:${App_Name[4]}应用服务启动失败" >> $File_Name # 把时间、应用名称写入日志
        fi
    fi
}

# 启动Java模拟数据程序
Start_Datagenerator_Bash_App(){
    if [[ $(Check_JavaData_Status) == "${App_Name[5]}${Service_Status[0]}" ]]; then
        echo "${App_Name[5]}${Service_Status[0]}"
    else
        cd $Script_Dir/ScriptFile/bash
        nohup ./DataGenerator.sh & # 启动程序的命令
        if [[ $(Get_Thread_ID "${Thread_Name[5]}") != null ]]; then
            echo "${App_Name[5]}${Action_Status[0]}"
            echo "${Now_Date}:${App_Name[5]}应用服务启动成功,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[5]}${Action_Status[2]}"
            echo "${Now_Date}:${App_Name[5]}应用服务启动失败" >> $File_Name # 把时间、应用名称写入日志
        fi
    fi
}

# 启动net模拟数据程序
Start_Datagenerator_Python_App(){
    if [[ $(Check_NetData_Status) == "${App_Name[6]}${Service_Status[0]}" ]]; then
        echo "${App_Name[6]}${Service_Status[0]}"
    else
        cd $Script_Dir/ScriptFile/python
        source venv/bin/activate
        nohup python DataGenerator.py & # 启动程序的命令
        if [[ $(Get_Thread_ID "${Thread_Name[6]}") != null ]]; then
            echo "${App_Name[6]}${Action_Status[0]}"
            echo "${Now_Date}:${App_Name[6]}应用服务启动成功,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[6]}${Action_Status[2]}"
            echo "${Now_Date}:${App_Name[6]}应用服务启动失败" >> $File_Name # 把时间、应用名称写入日志
        fi
    fi
}

# 停止Java程序
Stop_Java_App(){
    if [[ $(Check_Java_Status) == "${App_Name[0]}${Service_Status[0]}" ]]; then
        Get_Thread_ID "${Thread_Name[0]}"
        kill -9 $pid
        if [[ $(Get_Thread_Num "${Thread_Name[0]}") > 0 && $(Get_Thread_ID "${Thread_Name[0]}") != null ]]; then
            echo "${App_Name[0]}${Action_Status[3]}"
            echo "${Now_Date}:${App_Name[0]}应用服务停止失败,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[0]}${Action_Status[1]}"
            echo "${Now_Date}:${App_Name[0]}应用服务停止成功" >> $File_Name # 把时间、应用名称写入日志
        fi
    else
        echo "${App_Name[0]}${Service_Status[1]}"
    fi
}

# 停止Net程序
Stop_Net_App(){
    if [[ $(Check_Net_Status) == "${App_Name[1]}${Service_Status[0]}" ]]; then
        Get_Thread_ID "${Thread_Name[1]}"
        kill -9 $pid
        if [[ $(Get_Thread_Num "${Thread_Name[1]}") > 0 && $(Get_Thread_ID "${Thread_Name[1]}") != null ]]; then
            echo "${App_Name[1]}${Action_Status[3]}"
            echo "${Now_Date}:${App_Name[1]}应用服务停止失败,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[1]}${Action_Status[1]}"
            echo "${Now_Date}:${App_Name[1]}应用服务停止成功" >> $File_Name # 把时间、应用名称写入日志
        fi
    else
        echo "${App_Name[1]}${Service_Status[1]}"
    fi
}

# 停止node程序
Stop_Node_App(){
    if [[ $(Check_Node_Status) == "${App_Name[2]}${Service_Status[0]}" ]]; then
        Get_Thread_ID "${Thread_Name[2]}"
        kill -9 $pid
        if [[ $(Get_Thread_Num "${Thread_Name[2]}") > 0 && $(Get_Thread_ID "${Thread_Name[2]}") != null ]]; then
            echo "${App_Name[2]}${Action_Status[3]}"
            echo "${Now_Date}:${App_Name[2]}应用服务停止失败,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[1]}${Action_Status[1]}"
            echo "${Now_Date}:${App_Name[2]}应用服务停止成功" >> $File_Name # 把时间、应用名称写入日志
        fi
    else
        echo "${App_Name[2]}${Service_Status[1]}"
    fi
}

# 停止python程序
Stop_Python_App(){
    if [[ $(Check_Python_Status) == "${App_Name[3]}${Service_Status[0]}" ]]; then
        Get_Thread_ID "${Thread_Name[3]}"
        kill -9 $pid
        if [[ $(Get_Thread_Num "${Thread_Name[3]}") > 0 && $(Get_Thread_ID "${Thread_Name[3]}") != null ]]; then
            echo "${App_Name[3]}${Action_Status[3]}"
            echo "${Now_Date}:${App_Name[3]}应用服务停止失败,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[3]}${Action_Status[1]}"
            echo "${Now_Date}:${App_Name[3]}应用服务停止成功" >> $File_Name # 把时间、应用名称写入日志
        fi
    else
        echo "${App_Name[3]}${Service_Status[1]}"
    fi
}

# 停止web程序
Stop_Demo_Web(){
    if [[ $(Check_Web_Status) == "${App_Name[4]}${Service_Status[0]}" ]]; then
        Get_Thread_ID "${Thread_Name[4]}"
        kill -9 $pid
        if [[ $(Get_Thread_Num "${Thread_Name[4]}") > 0 && $(Get_Thread_ID "${Thread_Name[4]}") != null ]]; then
            echo "${App_Name[4]}${Action_Status[3]}"
            echo "${Now_Date}:${App_Name[4]}应用服务停止失败,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[4]}${Action_Status[1]}"
            echo "${Now_Date}:${App_Name[4]}应用服务停止成功" >> $File_Name # 把时间、应用名称写入日志
        fi
    else
        echo "${App_Name[4]}${Service_Status[1]}"
    fi
}

# 停止Java模拟数据程序
Stop_Datagenerator_Bash_App(){
    if [[ $(Check_JavaData_Status) == "${App_Name[5]}${Service_Status[0]}" ]]; then
        Get_Thread_ID "${Thread_Name[5]}"
        kill -9 $pid
        if [[ $(Get_Thread_Num "${Thread_Name[5]}") > 0 && $(Get_Thread_ID "${Thread_Name[5]}") != null ]]; then
            echo "${App_Name[5]}${Action_Status[3]}"
            echo "${Now_Date}:${App_Name[5]}应用服务停止失败,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[5]}${Action_Status[1]}"
            echo "${Now_Date}:${App_Name[5]}应用服务停止成功" >> $File_Name # 把时间、应用名称写入日志
        fi
    else
        echo "${App_Name[5]}${Service_Status[1]}"
    fi
}

# 停止net模拟数据程序
Stop_Datagenerator_Python_App(){
    if [[ $(Check_NetData_Status) == "${App_Name[6]}${Service_Status[0]}" ]]; then
        Get_Thread_ID "${Thread_Name[6]}"
        kill -9 $pid
        if [[ $(Get_Thread_Num "${Thread_Name[6]}") > 0 && $(Get_Thread_ID "${Thread_Name[6]}") != null ]]; then
            echo "${App_Name[6]}${Action_Status[3]}"
            echo "${Now_Date}:${App_Name[6]}应用服务停止失败,线程ID=${pid}" >> $File_Name # 把时间、应用名称写入日志
        else
            echo "${App_Name[6]}${Action_Status[1]}"
            echo "${Now_Date}:${App_Name[6]}应用服务停止成功" >> $File_Name # 把时间、应用名称写入日志
        fi
    else
        echo "${App_Name[6]}${Service_Status[1]}"
    fi
}

# 开启程序
Start_All(){
    Start_Java_App
    Start_Net_App
    Start_Node_App
    Start_Python_App
    Start_Demo_Web
    Start_Datagenerator_Bash_App
    Start_Datagenerator_Python_App
}

# 结束程序
Stop_All(){
    Stop_Java_App
    Stop_Net_App
    Stop_Node_App
    Stop_Python_App
    Stop_Demo_Web
    Stop_Datagenerator_Bash_App
    Stop_Datagenerator_Python_App
}

# 状态查询
Status_All(){
    Check_Java_Status
    Check_Net_Status
    Check_Node_Status
    Check_Python_Status
    Check_Web_Status
    Check_JavaData_Status
    Check_NetData_Status
}

# 主函数
main(){
    # 程序初始化
    Script_Dir=$(
        cd $(dirname "$0") || exit
        pwd
    )
    
    set_runtime_vars
    
    Script_Param=$1
    case ${Script_Param} in
        "start")
            Start_All
        ;;
        "stop")
            Stop_All
        ;;
        "status")
            Status_All
        ;;
        *)
            echo "用法:startup.sh [选项]"
            echo "选项:[status: 状态查询] [start: 开启服务] [stop: 停止服务]"
        ;;
    esac
}

main "$@"

脚本设置开机自启动

将脚本添加到/etc/rc.local文件中

准确的讲/etc下的rc.local文件是rc.d文件中rc.local文件的软链接,找到rc.d下的rc.local文件,添加可执行选项。如果没有该文件可以自己创建。

touch rc.local
chmod +x ./rc.local

在/etc下创建rc.d下的rc.local文件的软链接

ln -s /etc/rc.d/rc.local /etc/

将你需要开机自启的脚本文件添加到rc.local文件中

sudo vi /etc/rc.local
# 要启动的脚本的绝对路径
# shell.name 是你的脚本文件名
# 脚本后面的start是启动脚本需要的参数,没有可以不写
/.../shell.name.sh start

检查rc-local.service服务是否启动

要想你的脚本文件开机自启动还需要用到rc-local.service这个服务。

systemctl status rc-local.service

重启系统

sudo reboot
posted @ 2023-05-09 14:19  lym003  阅读(541)  评论(0编辑  收藏  举报