#!/bin/sh
# chkconfig: 2345 85 15
# description: EMSD Daemon Service Control Script
# processname: emsd
# config: /opt/lnxall_app/bin/emsd_start.sh
# pidfile: /var/run/emsd.pid

# 核心路径定义（无需修改）
DAEMON_SCRIPT="/opt/lnxall_app/bin/emsd_startup.sh"
PROG="proto_forward"
PID_FILE="/var/run/emsd.pid"
LOG_FILE="/var/log/emsd_service.log"

# 日志输出函数（带时间戳）
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> ${LOG_FILE}
}

# 检查守护脚本是否存在（前置校验）
if [ ! -f ${DAEMON_SCRIPT} ]; then
    echo "错误：守护脚本 ${DAEMON_SCRIPT} 不存在！"
    log "错误：守护脚本 ${DAEMON_SCRIPT} 不存在，服务操作失败"
    exit 1
fi

# 赋予守护脚本执行权限（兜底处理）
chmod +x ${DAEMON_SCRIPT} >/dev/null 2>&1

# -------------------------- 独立功能函数 --------------------------
# 启动服务函数
do_start() {
    # 检查服务是否已运行
    if [ -f ${PID_FILE} ] && ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
        echo "emsd 服务已在运行，PID: $(cat ${PID_FILE})"
        log "emsd 服务已运行，PID: $(cat ${PID_FILE})，启动操作跳过"
        return 0
    fi
    # 后台启动守护脚本并记录PID
    echo "正在启动 emsd 服务..."
    nohup ${DAEMON_SCRIPT} >/dev/null 2>&1 &
    echo $! > ${PID_FILE}
    # 延时验证启动结果（适配守护脚本初始化）
    sleep 2
    if ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
        local PID=$(cat ${PID_FILE})
        echo "emsd 服务启动成功，PID: ${PID}"
        log "emsd 服务启动成功，PID: ${PID}"
        return 0
    else
        rm -f ${PID_FILE}
        echo "emsd 服务启动失败，请查看日志排查"
        log "emsd 服务启动失败，守护脚本执行异常"
        return 1
    fi
}
do_stop() {
    # 检查服务是否未运行，清理无效PID文件
    if [ ! -f ${PID_FILE} ] || ! ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
        echo "emsd 服务未运行"
        log "emsd 服务未运行，停止操作跳过"
        rm -f ${PID_FILE} >/dev/null 2>&1
        return 0
    fi

    local MAIN_PID=$(cat ${PID_FILE})
    echo "正在停止 emsd 服务(PID: ${MAIN_PID})"
    log "开始停止emsd服务,主PID: ${MAIN_PID}"

    # 递归终止所有子进程
    kill --  ${MAIN_PID} >/dev/null 2>&1

    res=$(ps aux | grep $PROG | grep -v grep | wc -l)
    if [ $res -gt 0 ]; then #如果进程为>0
        killall -9 $PROG
    fi

    sleep 1

    if ps -p ${MAIN_PID} >/dev/null 2>&1; then
        kill -9 ${MAIN_PID} >/dev/null 2>&1
    fi

    res=$(ps aux | grep $PROG | grep -v grep | wc -l)
    if [ $res -gt 0 ]; then #如果进程为>0
        killall -9 $PROG
    fi

    # 清理PID文件，标记服务停止
    rm -f ${PID_FILE}
    log "emsd 服务停止成功"
    return 0
}

# 重启服务函数
do_restart() {
    echo "正在重启 emsd 服务..."
    do_stop
    sleep 1
    do_start
    log "emsd 服务重启操作执行完成"
    return 0
}

# 状态查询函数
do_status() {
    if [ -f ${PID_FILE} ] && ps -p $(cat ${PID_FILE}) >/dev/null 2>&1; then
        local MAIN_PID=$(cat ${PID_FILE})
        echo "emsd 服务正在运行，PID: ${MAIN_PID}"
        # 显示相关子进程信息
        echo "相关子进程："
        ps -ef | grep -P "PPID=${MAIN_PID}" | grep -v grep || echo "  无活跃子进程"
        log "查询emsd服务状态：运行中，PID: ${MAIN_PID}"
        return 0
    else
        echo "emsd 服务未运行"
        rm -f ${PID_FILE} >/dev/null 2>&1  # 清理无效PID文件
        log "查询emsd服务状态：未运行"
        return 3
    fi
}

# -------------------------- 主逻辑入口 --------------------------
case "$1" in
    start)
        do_start
        exit $?
        ;;
    stop)
        do_stop
        exit $?
        ;;
    restart)
        do_restart
        exit $?
        ;;
    status)
        do_status
        exit $?
        ;;
    *)
        # 非法命令提示
        echo "使用方法：$0 {start|stop|restart|status}"
        exit 2
        ;;
esac

exit 0
