在宝塔面板中,AnQiCMS的停止脚本(stop.sh)具体如何配置和执行?

作为一位资深的网站运营专家,我深知一套高效稳定的内容管理系统(CMS)对于企业在线业务的重要性。安企CMS(AnQiCMS)以其基于Go语言的高性能和简洁高效的架构,成为了众多中小企业和内容运营团队的理想选择。然而,再优秀的系统也离不开精细化的运维管理,其中就包括如何安全、有效地停止其运行进程。今天,我们就来深入探讨在宝塔面板环境中,AnQiCMS的停止脚本stop.sh究竟该如何配置与执行。

优雅停止:为何我们需要stop.sh

您可能会想,停止一个网站服务,直接在宝塔面板里点个停止按钮不就行了?或者简单粗暴地kill掉进程?对于AnQiCMS这样基于Go语言开发的应用程序而言,其运行机制与传统的PHP、Java应用有所不同。它通常以一个独立的二进制文件形式运行,其进程管理需要更为明确的指令。stop.sh脚本正是为了实现这一点而生,它不仅仅是强制终止,更承载着定位正确进程并安全关闭的职责,这对于避免数据损坏、确保下次启动的顺利至关重要。

stop.sh的核心任务是找到当前正在运行的AnQiCMS主进程,并向其发送终止信号。这个过程涉及到几个关键步骤和Unix/Linux命令的巧妙组合。

揭秘stop.sh脚本内容

根据AnQiCMS的官方文档,一个典型的stop.sh脚本大致会是这个样子:

#!/bin/bash
### stop anqicms
# author fesion
# the bin name is anqicms
BINNAME=anqicms
BINPATH="$( cd "$( dirname "$0"  )" && pwd  )"

# check the pid if exists
exists=`ps -ef | grep '\<anqicms\>' |grep -v grep |awk '{printf $2}'`
echo "$(date +'%Y%m%d %H:%M:%S') $BINNAME PID check: $exists" >> $BINPATH/check.log
echo "PID $BINNAME check: $exists"
if [ $exists -eq 0 ]; then
    echo "$BINNAME NOT running"
else
    echo "$BINNAME is running"
    kill -9 $exists
    echo "$BINNAME is stop"
fi

让我们分解一下这段脚本的精髓:

  1. BINNAME=anqicms:这行定义了AnQiCMS可执行文件的名称。默认情况下,AnQiCMS的可执行文件通常就叫做anqicms。如果您的文件名有所改动,务必在此处更新。
  2. BINPATH="$( cd "$( dirname "$0" )" && pwd )":这行代码非常巧妙,它自动获取了当前stop.sh脚本所在的绝对路径,并将其赋值给BINPATH。这意味着,无论您将脚本放在何处,只要与AnQiCMS的可执行文件在同一目录下,它就能自动识别其运行环境。
  3. exists=ps -ef | grep ‘<anqicms>’ |grep -v grep |awk ‘{printf $2}’”:这是脚本的核心命令,用于查找AnQiCMS的进程ID(PID)。
    • ps -ef:列出当前系统上所有正在运行的进程的详细信息。
    • grep '\<anqicms\>':从进程列表中筛选出包含“anqicms”关键字的行。\<\>是单词边界符,确保只匹配完整的“anqicms”单词,而非“anqicms_test”这类部分匹配。
    • grep -v grep:这一步是为了排除掉grep命令自身的进程,因为grep命令本身也会包含“grep”关键字,避免误杀。
    • awk '{printf $2}':提取出过滤后进程信息的第二列,通常就是进程ID(PID)。
  4. if [ $exists -eq 0 ]; then ... else ... fi:这是一个条件判断。
    • 如果exists(即找到的PID)为0,说明AnQiCMS进程未运行,脚本会输出“NOT running”。
    • 如果exists不为0,说明找到了正在运行的AnQiCMS进程,脚本会输出“is running”,然后执行kill -9 $exists命令。
  5. kill -9 $exists:这是强制终止指定PID进程的命令。-9是一个强制终止信号,意味着进程将立即停止,不做任何清理工作。虽然有些粗暴,但在确保进程停止方面非常有效。

在宝塔面板中配置stop.sh

有了对脚本的理解,在宝塔面板中配置就变得轻而易举了。

  1. 登录宝塔面板并进入“计划任务”:在左侧菜单栏找到并点击“计划任务”选项。

  2. 添加计划任务:点击页面上方的“添加计划任务”按钮。

  3. 配置任务参数

    • 任务类型:选择“Shell脚本”。
    • 任务名称:建议命名为“停止AnQiCMS”或类似清晰的名称。
    • 执行周期:官方文档中stop.sh的示例是每月执行一次,这通常是为了定期清理或配合计划性维护。但考虑到停止操作往往是临时性和主动性的,您也可以选择手动执行,或者根据实际维护需求设置(例如,在每月某个固定时间段进行维护前自动停止)。如果您只是为了手动停止,可以选择一个不常用的周期,如“月”,然后通过点击执行按钮来触发。
    • 脚本内容:将上面提供的stop.sh脚本内容粘贴到此处的文本框中。

    【关键定制点】 在粘贴脚本前,请务必检查并修改脚本中的BINNAMEBINPATH变量。

    • BINPATH:这需要是您的AnQiCMS程序所在的根目录,例如:/www/wwwroot/yourdomain.com。您可以在宝塔面板的“文件”管理中找到您AnQiCMS的部署路径。
    • BINNAME:这是AnQiCMS的可执行文件名,通常是anqicms。如果您在安装时进行了重命名(例如,为了区分多站点而命名为anqicms_site1),请务必同步修改。
    • grep '\<anqicms\>' 中的anqicms也需要与BINNAME保持一致。

    例如,如果您的AnQiCMS部署在/www/wwwroot/myanqicms目录下,可执行文件名为anqicms_main,那么脚本中对应的部分应修改为:

    #!/bin/bash
    ### stop anqicms
    # author fesion
    # the bin name is anqicms
    BINNAME=anqicms_main # <--- 修改为您的可执行文件名
    BINPATH="/www/wwwroot/myanqicms" # <--- 修改为您的程序根目录
    
    # check the pid if exists
    exists=`ps -ef | grep '\<anqicms_main\>' |grep -v grep |awk '{printf $2}'` # <--- 修改 grep 的匹配名
    echo "$(date +'%Y%m%d %H:%M:%S') $BINNAME PID check: $exists" >> $BINPATH/check.log
    echo "PID $BINNAME check: $exists"
    if [ $exists -eq 0 ]; then
        echo "$BINNAME NOT running"
    else
        echo "$BINNAME is running"
        kill -9 $exists
        echo "$BINNAME is stop"
    fi
    
    • 点击“添加任务”:完成上述配置后,点击按钮保存任务。

执行stop.sh脚本

当您需要停止AnQiCMS服务时,只需在宝塔面板的“计划任务”列表中,找到您刚刚创建的“