本文目录导读:

我来提供一个功能完善的程序启动器脚本示例,这个脚本包含常用功能,可以根据需要调整:
基础版程序启动器
#!/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
选择适合你需求的版本,并根据实际情况调整配置。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播