本文目录导读:

我来提供一个功能完善的程序启动器脚本示例,这个脚本包含常用功能,可以根据需要调整:
基础版程序启动器
#!/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"]="启动命令"
进阶功能建议
-
开机自启动:
# 添加cron @reboot /path/to/launcher.sh restart all
-
系统服务:
[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
选择适合你需求的版本,并根据实际情况调整配置。