如何写一个程序启动器脚本

wen 实用脚本 1

本文目录导读:

如何写一个程序启动器脚本

  1. 基础版程序启动器
  2. 增强版启动器(带菜单交互)
  3. 通用配置版启动器
  4. 使用方法
  5. 进阶功能建议

我来提供一个功能完善的程序启动器脚本示例,这个脚本包含常用功能,可以根据需要调整:

基础版程序启动器

#!/bin/bash
# 程序启动器 - 基础版
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 配置
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_FILE="$SCRIPT_DIR/launcher.log"
PID_DIR="$SCRIPT_DIR/pids"
# 程序列表配置(可按需修改)
declare -A PROGRAMS
PROGRAMS["nginx"]="nginx -c /usr/local/nginx/conf/nginx.conf"
PROGRAMS["mysql"]="mysqld_safe"
PROGRAMS["redis"]="redis-server"
# 确保目录存在
mkdir -p "$PID_DIR"
# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 显示帮助
usage() {
    echo "可用命令:"
    echo "  ./launcher.sh start [program_name]  - 启动程序"
    echo "  ./launcher.sh stop [program_name]   - 停止程序"
    echo "  ./launcher.sh restart [program]     - 重启程序"
    echo "  ./launcher.sh status                - 查看所有程序状态"
    echo "  ./launcher.sh list                  - 列出所有程序"
    echo "  ./launcher.sh all                   - 启动所有程序"
    echo ""
    echo "示例:"
    echo "  ./launcher.sh start nginx"
    echo "  ./launcher.sh start  # 启动第一个程序"
}
# 检查程序是否在运行
is_running() {
    local program_name=$1
    local pid_file="$PID_DIR/${program_name}.pid"
    if [ -f "$pid_file" ]; then
        local pid=$(cat "$pid_file")
        if kill -0 "$pid" 2>/dev/null; then
            return 0
        fi
    fi
    return 1
}
# 获取程序PID
get_pid() {
    local program_name=$1
    local pid_file="$PID_DIR/${program_name}.pid"
    if [ -f "$pid_file" ]; then
        cat "$pid_file"
        return 0
    fi
    echo "PID文件不存在"
    return 1
}
# 启动单个程序
start_program() {
    local program_name=$1
    if [ -z "$program_name" ]; then
        log "${YELLOW}未指定程序名,启动第一个程序: $(echo ${!PROGRAMS[@]} | cut -d' ' -f1)${NC}"
        program_name=$(echo ${!PROGRAMS[@]} | cut -d' ' -f1)
    fi
    if [ -z "${PROGRAMS[$program_name]}" ]; then
        log "${RED}程序 $program_name 不存在!${NC}"
        usage
        return 1
    fi
    if is_running "$program_name"; then
        log "${YELLOW}$program_name 已经在运行中${NC}"
        return 0
    fi
    log "${BLUE}正在启动 $program_name...${NC}"
    # 执行启动命令
    ${PROGRAMS[$program_name]} &
    local pid=$!
    echo $pid > "$PID_DIR/${program_name}.pid"
    # 等待并检查是否启动成功
    sleep 1
    if is_running "$program_name"; then
        log "${GREEN}$program_name 启动成功 (PID: $pid)${NC}"
    else
        log "${RED}$program_name 启动失败${NC}"
        return 1
    fi
}
# 停止单个程序
stop_program() {
    local program_name=$1
    if [ -z "$program_name" ]; then
        log "${YELLOW}未指定程序名${NC}"
        usage
        return 1
    fi
    if ! is_running "$program_name"; then
        log "${YELLOW}$program_name 未在运行${NC}"
        return 0
    fi
    local pid=$(get_pid "$program_name")
    log "${BLUE}正在停止 $program_name (PID: $pid)...${NC}"
    kill "$pid" 2>/dev/null
    # 等待进程结束
    for i in {1..10}; do
        if ! is_running "$program_name"; then
            rm -f "$PID_DIR/${program_name}.pid"
            log "${GREEN}$program_name 已停止${NC}"
            return 0
        fi
        sleep 0.5
    done
    # 强制停止
    log "${YELLOW}$program_name 未响应,尝试强制停止...${NC}"
    kill -9 "$pid" 2>/dev/null
    rm -f "$PID_DIR/${program_name}.pid"
    log "${GREEN}$program_name 已被强制停止${NC}"
}
# 重启程序
restart_program() {
    local program_name=$1
    stop_program "$program_name"
    sleep 1
    start_program "$program_name"
}
# 显示状态
show_status() {
    log "${BLUE}程序状态:${NC}"
    for program in "${!PROGRAMS[@]}"; do
        if is_running "$program"; then
            pid=$(get_pid "$program")
            echo -e "${GREEN}● $program - 运行中 (PID: $pid)${NC}"
        else
            echo -e "${RED}○ $program - 未运行${NC}"
        fi
    done
}
# 显示所有程序
show_list() {
    log "${BLUE}可用程序列表:${NC}"
    for program in "${!PROGRAMS[@]}"; do
        echo "  - $program: ${PROGRAMS[$program]}"
    done
}
# 启动所有程序
start_all() {
    for program in "${!PROGRAMS[@]}"; do
        start_program "$program"
    done
}
# 主函数
main() {
    local command=$1
    local program=$2
    case $command in
        start)
            start_program "$program"
            ;;
        stop)
            stop_program "$program"
            ;;
        restart)
            restart_program "$program"
            ;;
        status)
            show_status
            ;;
        list)
            show_list
            ;;
        all)
            start_all
            ;;
        help|--help|-h)
            usage
            ;;
        *)
            usage
            ;;
    esac
}
# 执行
main "$@"

增强版启动器(带菜单交互)

#!/bin/bash
# 程序启动器 - 增强版
# 颜色
RED='\e[1;31m'
GREEN='\e[1;32m'
YELLOW='\e[1;33m'
BLUE='\e[1;34m'
PURPLE='\e[1;35m'
CYAN='\e[1;36m'
WHITE='\e[1;37m'
NC='\e[0m'
# 配置
VERSION="1.0.0"
AUTHOR="Your Name"
# 程序配置
declare -a PROGRAMS=(
    "nginx"
    "mysql" 
    "redis"
)
# 各程序启动命令
start_command() {
    case $1 in
        nginx)
            nginx -c /usr/local/nginx/conf/nginx.conf
            ;;
        mysql)
            mysqld_safe &
            ;;
        redis)
            redis-server
            ;;
    esac
}
# 各程序停止命令  
stop_command() {
    case $1 in
        nginx)
            nginx -s stop
            ;;
        mysql)
            mysqladmin shutdown
            ;;
        redis)
            redis-cli shutdown
            ;;
    esac
}
# 检查状态
check_status() {
    case $1 in
        nginx)
            pgrep -x nginx > /dev/null && echo "运行中" || echo "已停止"
            ;;
        mysql)
            pgrep -x mysqld > /dev/null && echo "运行中" || echo "已停止"
            ;;
        redis)
            pgrep -x redis-server > /dev/null && echo "运行中" || echo "已停止"
            ;;
    esac
}
# 选择程序
select_program() {
    echo -e "${CYAN}请选择程序:${NC}"
    for i in "${!PROGRAMS[@]}"; do
        echo -e "  ${GREEN}$((i+1)).${NC} ${PROGRAMS[$i]}"
    done
    echo -e "  ${GREEN}0.${NC} 返回"
    read -p "选择: " choice
    case $choice in
        [1-3])
            echo "${PROGRAMS[$((choice-1))]}"
            ;;
        0)
            return 1
            ;;
        *)
            echo -e "${RED}无效选择${NC}"
            return 1
            ;;
    esac
}
# 交互菜单
show_menu() {
    clear
    echo -e "${BLUE}=================================${NC}"
    echo -e "${PURPLE}    程序启动器 v$VERSION${NC}"
    echo -e "${BLUE}=================================${NC}"
    echo -e "${GREEN}1.${NC} 启动程序"
    echo -e "${GREEN}2.${NC} 停止程序"
    echo -e "${GREEN}3.${NC} 重启程序"
    echo -e "${GREEN}4.${NC} 查看状态"
    echo -e "${GREEN}5.${NC} 显示错误日志"
    echo -e "${RED}0.${NC} 退出"
    echo -e "${BLUE}=================================${NC}"
    echo ""
}
# 日志查看
show_logs() {
    local logfile="/var/log/${1}.log"
    if [ -f "$logfile" ]; then
        tail -20 "$logfile"
    else
        echo -e "${RED}日志文件不存在: $logfile${NC}"
    fi
    read -p "按任意键继续..."
}
# 执行操作
execute() {
    local program=$1
    local action=$2
    echo -e "${BLUE}正在${action} $program...${NC}"
    case $action in
        启动)
            start_command "$program"
            ;;
        停止)
            stop_command "$program"
            ;;
        重启)
            stop_command "$program"
            sleep 1
            start_command "$program"
            ;;
        状态)
            check_status "$program"
            ;;
    esac
    sleep 1
    echo -e "${GREEN}操作完成${NC}"
    read -p "按任意键继续..."
}
# 主循环
while true; do
    show_menu
    read -p "请输入选择: " choice
    case $choice in
        1)
            if program=$(select_program); then
                execute "$program" "启动"
            fi
            ;;
        2)
            if program=$(select_program); then
                execute "$program" "停止"
            fi
            ;;
        3)
            if program=$(select_program); then
                execute "$program" "重启"
            fi
            ;;
        4)
            echo -e "${CYAN}程序状态:${NC}"
            for prog in "${PROGRAMS[@]}"; do
                status=$(check_status "$prog")
                if [ "$status" = "运行中" ]; then
                    echo -e "${GREEN}● $prog: $status${NC}"
                else
                    echo -e "${RED}○ $prog: $status${NC}"
                fi
            done
            read -p "按任意键继续..."
            ;;
        5)
            if program=$(select_program); then
                show_logs "$program"
            fi
            ;;
        0)
            echo -e "${GREEN}再见!${NC}"
            exit 0
            ;;
        *)
            echo -e "${RED}无效选择${NC}"
            read -p "按任意键继续..."
            ;;
    esac
done

通用配置版启动器

#!/bin/bash
# 通用程序启动器
# 配置由外部文件控制
CONFIG_FILE="$1"
if [ -z "$CONFIG_FILE" ]; then
    CONFIG_FILE="/etc/program_launcher.conf"
fi
# 读取配置文件
if [ ! -f "$CONFIG_FILE" ]; then
    echo "配置文件不存在: $CONFIG_FILE"
    exit 1
fi
source "$CONFIG_FILE"
# 配置文件格式示例 (/etc/program_launcher.conf):
# PROGRAMS["nginx"]="nginx -c /etc/nginx/nginx.conf"
# PROGRAMS["mysql"]="/usr/local/mysql/bin/mysqld"
# PROGRAMS["redis"]="redis-server /etc/redis/redis.conf"
# 主逻辑
case "$1" in
    start)
        for prog in "${!PROGRAMS[@]}"; do
            echo "启动 $prog..."
            eval "${PROGRAMS[$prog]} &"
            echo $! > "/tmp/${prog}.pid"
        done
        ;;
    stop)
        for prog in "${!PROGRAMS[@]}"; do
            if [ -f "/tmp/${prog}.pid" ]; then
                kill "$(cat /tmp/${prog}.pid)" 2>/dev/null
                echo "已停止 $prog"
            fi
        done
        ;;
    status)
        for prog in "${!PROGRAMS[@]}"; do
            if [ -f "/tmp/${prog}.pid" ] && kill -0 "$(cat /tmp/${prog}.pid)" 2>/dev/null; then
                echo "$prog: 运行中 (PID: $(cat /tmp/${prog}.pid))"
            else
                echo "$prog: 未运行"
            fi
        done
        ;;
    *)
        echo "用法: $0 {start|stop|status} [配置文件]"
        ;;
esac

使用方法

授权脚本

chmod +x launcher.sh

基础用法

# 显示帮助
./launcher.sh help
# 启动程序
./launcher.sh start nginx
# 停止程序
./launcher.sh stop nginx
# 重启程序
./launcher.sh restart nginx
# 查看状态
./launcher.sh status
# 列出所有程序
./launcher.sh list

添加新程序

在配置部分添加:

PROGRAMS["program_name"]="启动命令"

进阶功能建议

  1. 开机自启动

    # 添加cron
    @reboot /path/to/launcher.sh restart all
  2. 系统服务

    [Unit]
    Description=Program Launcher
    After=network.target

[Service] ExecStart=/path/to/launcher.sh all Restart=always

[Install] WantedBy=multi-user.target


3. **邮件通知**:
```bash
if [ $? -ne 0 ]; then
    echo "程序启动失败" | mail -s "程序启动警告" admin@example.com
fi

选择适合你需求的版本,并根据实际情况调整配置。

抱歉,评论功能暂时关闭!