作为一个经验丰富的安企CMS网站运营人员,我深知内容管理系统的稳定运行对网站业务的重要性。在日常维护中,我们会频繁与系统的启动和停止脚本打交道。对于安企CMS而言,其 stop.sh 脚本中采用 pwd 命令来动态确定 BINPATH 变量,这体现了设计者在确保系统健壮性和用户操作便捷性方面的深思熟虑。
安企CMS作为一个基于Go语言开发、致力于提供高效可定制内容管理解决方案的系统,在部署和运行过程中,其可执行文件以及相关的日志、配置文件等都需要有一个明确的存放位置。为了方便用户管理,安企CMS提供了 start.sh 和 stop.sh 这样的Shell脚本来自动化启动和停止服务。
首先,我们来理解 BINPATH 在这些脚本中的作用。BINPATH 变量通常指向安企CMS可执行文件所在的目录。当脚本需要执行可执行文件(如启动命令)或访问其同目录下的资源(如日志文件 running.log、check.log,或者查找正在运行的进程PID)时,都需要依赖 BINPATH 来准确找到这些位置。
在 start.sh 脚本中,我们可能会看到 BINPATH 被明确地设置为一个绝对路径,例如 /www/wwwroot/anqicms。这通常是在安装初期由网站管理员根据实际部署位置手动配置的。它假定AnQiCMS的可执行文件将始终位于这个固定位置。
然而,在 stop.sh 脚本中,BINPATH 的定义方式则显得更为巧妙和通用:BINPATH="$( cd "$( dirname "$0" )" && pwd )"。这条命令并非直接指定一个固定路径,而是动态地计算出脚本自身的绝对路径。这行命令可以分解为以下几个步骤来理解:
$0:在Shell脚本中,$0 代表的是当前执行的脚本文件本身的路径,包括文件名。例如,如果 stop.sh 在 /www/wwwroot/anqicms/ 目录下,那么 $0 可能就是 /www/wwwroot/anqicms/stop.sh。
dirname "$0":这个命令的作用是从 $0 中提取出目录部分,即去除文件名。以上述例子为例,dirname "$0" 将会返回 /www/wwwroot/anqicms。
cd "$( dirname "$0" )":这一步是关键。它将当前Shell会话的工作目录更改为 stop.sh 脚本所在的目录。这样做的目的是为了确保后续命令都是相对于脚本自身的目录来执行的。
pwd:在 cd 命令执行完毕后,pwd(Print Working Directory)命令会打印出当前工作目录的绝对路径。由于上一步已经 cd 到了脚本所在的目录,因此 pwd 此时输出的就是 stop.sh 脚本所在的绝对目录。
最终,通过 $(...) 这一Shell命令替换语法,将 pwd 的输出赋值给 BINPATH 变量,从而实现了动态获取脚本自身所在目录的绝对路径。
那么,为什么 stop.sh 需要如此费力地动态计算路径,而不是像 start.sh 那样直接使用一个固定的绝对路径呢?这主要基于以下几个重要的考量:
操作的灵活性:网站管理员可能从任何目录执行 stop.sh 脚本,例如 /root 目录、某个自定义脚本目录,或者直接通过 /etc/init.d/anqicms stop 这样的服务管理命令调用。如果 stop.sh 依赖于一个硬编码的绝对路径