#!/bin/bash # 启动/停止/重启脚本 # ===================== 配置区 ===================== # 程序路径 AGENT_PATH="./dns-server" # 日志文件路径 LOG_FILE="./server.log" # PID文件路径(记录进程ID) PID_FILE="./server.pid" # 启动参数(根据实际需求调整) START_ARGS="" # 工作目录 WORK_DIR="." # ==================== 配置区结束 ==================== # 检查程序文件是否存在 check_agent_exists() { if [ ! -f "${AGENT_PATH}" ]; then echo "错误:程序文件 ${AGENT_PATH} 不存在!" exit 1 fi if [ ! -x "${AGENT_PATH}" ]; then echo "错误:程序文件 ${AGENT_PATH} 没有执行权限,正在尝试添加..." chmod +x "${AGENT_PATH}" if [ $? -ne 0 ]; then echo "错误:添加执行权限失败,请手动执行 chmod +x ${AGENT_PATH}" exit 1 fi fi } # 检查进程是否运行 check_running() { if [ -f "${PID_FILE}" ]; then PID=$(cat "${PID_FILE}") if ps -p "${PID}" > /dev/null 2>&1; then return 0 # 运行中 else rm -f "${PID_FILE}" # PID文件存在但进程已死,清理PID文件 fi fi return 1 # 未运行 } # 启动程序 start_agent() { if check_running; then echo "✅ dns-server 已在运行(PID: $(cat ${PID_FILE}))" return 0 fi echo "🚀 正在启动 dns-server(工作目录:${WORK_DIR})..." # 新增:检查并切换工作目录 if [ ! -d "${WORK_DIR}" ]; then echo "⚠️ 工作目录 ${WORK_DIR} 不存在,正在创建..." mkdir -p "${WORK_DIR}" if [ $? -ne 0 ]; then echo "❌ 创建工作目录 ${WORK_DIR} 失败!" exit 1 fi fi # 切换到工作目录(关键:程序将在此目录下运行) cd "${WORK_DIR}" || { echo "❌ 切换到工作目录 ${WORK_DIR} 失败!" exit 1 } # 创建日志目录 mkdir -p "$(dirname ${LOG_FILE})" # 后台启动程序(注意:cd仅影响当前子进程,需在同一行执行) nohup "${AGENT_PATH}" ${START_ARGS} > "${LOG_FILE}" 2>&1 & AGENT_PID=$! echo "${AGENT_PID}" > "${PID_FILE}" # 等待检查启动状态 sleep 2 if check_running; then echo "✅ dns-server 启动成功(PID: ${AGENT_PID},工作目录:${WORK_DIR})" echo "日志文件:${LOG_FILE}" else echo "❌ dns-server 启动失败!请查看日志:${LOG_FILE}" rm -f "${PID_FILE}" exit 1 fi } # 停止程序 stop_agent() { if ! check_running; then echo "ℹ️ dns-server 未运行" return 0 fi PID=$(cat "${PID_FILE}") echo "🛑 正在停止 dns-server(PID: ${PID})..." # 优雅停止(先尝试TERM信号,失败则强制KILL) kill "${PID}" > /dev/null 2>&1 sleep 3 if ps -p "${PID}" > /dev/null 2>&1; then echo "⚠️ 优雅停止失败,强制杀死进程..." kill -9 "${PID}" > /dev/null 2>&1 sleep 1 fi # 清理PID文件 rm -f "${PID_FILE}" echo "✅ dns-server 已停止" } # 查看状态 status_agent() { if check_running; then echo "✅ dns-server 运行中(PID: $(cat ${PID_FILE}))" else echo "ℹ️ dns-server 未运行" fi } # 重启程序 restart_agent() { echo "🔄 正在重启 dns-server..." stop_agent sleep 2 start_agent } # 帮助信息 show_help() { echo "使用方法:$0 [start|stop|restart|status|help]" echo " start - 启动 dns-server" echo " stop - 停止 dns-server" echo " restart - 重启 dns-server" echo " status - 查看 dns-server 运行状态" echo " help - 显示帮助信息" } # 主逻辑 main() { # 检查是否为root用户(可选,根据需求调整) if [ "$(id -u)" -ne 0 ]; then echo "警告:建议使用root用户运行此脚本(当前用户:$(whoami))" # exit 1 # 如果强制要求root,取消注释 fi check_agent_exists case "$1" in start) start_agent ;; stop) stop_agent ;; restart) restart_agent ;; status) status_agent ;; help|--help|-h) show_help ;; *) echo "错误:无效参数 '$1'" show_help exit 1 ;; esac } # 执行主逻辑 main "$@"