作为一位资深的网站运营专家,我深知一套高效稳定的内容管理系统(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
让我们分解一下这段脚本的精髓:
BINNAME=anqicms:这行定义了AnQiCMS可执行文件的名称。默认情况下,AnQiCMS的可执行文件通常就叫做anqicms。如果您的文件名有所改动,务必在此处更新。BINPATH="$( cd "$( dirname "$0" )" && pwd )":这行代码非常巧妙,它自动获取了当前stop.sh脚本所在的绝对路径,并将其赋值给BINPATH。这意味着,无论您将脚本放在何处,只要与AnQiCMS的可执行文件在同一目录下,它就能自动识别其运行环境。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)。
if [ $exists -eq 0 ]; then ... else ... fi:这是一个条件判断。- 如果
exists(即找到的PID)为0,说明AnQiCMS进程未运行,脚本会输出“NOT running”。 - 如果
exists不为0,说明找到了正在运行的AnQiCMS进程,脚本会输出“is running”,然后执行kill -9 $exists命令。
- 如果
kill -9 $exists:这是强制终止指定PID进程的命令。-9是一个强制终止信号,意味着进程将立即停止,不做任何清理工作。虽然有些粗暴,但在确保进程停止方面非常有效。
在宝塔面板中配置stop.sh
有了对脚本的理解,在宝塔面板中配置就变得轻而易举了。
登录宝塔面板并进入“计划任务”:在左侧菜单栏找到并点击“计划任务”选项。
添加计划任务:点击页面上方的“添加计划任务”按钮。
配置任务参数:
- 任务类型:选择“Shell脚本”。
- 任务名称:建议命名为“停止AnQiCMS”或类似清晰的名称。
- 执行周期:官方文档中
stop.sh的示例是每月执行一次,这通常是为了定期清理或配合计划性维护。但考虑到停止操作往往是临时性和主动性的,您也可以选择手动执行,或者根据实际维护需求设置(例如,在每月某个固定时间段进行维护前自动停止)。如果您只是为了手动停止,可以选择一个不常用的周期,如“月”,然后通过点击执行按钮来触发。 - 脚本内容:将上面提供的
stop.sh脚本内容粘贴到此处的文本框中。
【关键定制点】 在粘贴脚本前,请务必检查并修改脚本中的
BINNAME和BINPATH变量。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服务时,只需在宝塔面板的“计划任务”列表中,找到您刚刚创建的“