bash
SIGNAL=${SIGNAL:-TERM}
OSNAME=$(uname -s)
if [[ "$OSNAME" == "OS/390" ]]; then
if [ -z $JOBNAME ]; then
JOBNAME="ZKEESTRT"
fi
PIDS=$(ps -A -o pid,jobname,comm | grep -i $JOBNAME | grep java | grep -v grep | awk '{print $1}')
elif [[ "$OSNAME" == "OS400" ]]; then
PIDS=$(ps -Af | grep java | grep -i QuorumPeerMain | grep -v grep | awk '{print $2}')
else
PIDS=$(ps ax | grep java | grep -i QuorumPeerMain | grep -v grep | awk '{print $1}')
fi
if [ -z "$PIDS" ]; then
echo "No zookeeper server to stop"
exit 1
else
kill -s $SIGNAL $PIDS
fi
以下是 zookeeper-server-stop.sh
脚本的逐行解释:
bash
SIGNAL=${SIGNAL:-TERM}
-
作用 :设置信号变量
SIGNAL
,默认值为TERM
(终止信号)。 -
解释 :如果调用脚本时未通过环境变量指定
SIGNAL
,则使用TERM
作为默认信号。TERM
允许进程优雅退出。
bash
OSNAME=$(uname -s)
-
作用:获取当前操作系统的名称。
-
解释 :通过
uname -s
命令获取系统类型(如 Linux、Darwin、OS/390 等),结果存入OSNAME
变量。
bash
if [[ "$OSNAME" == "OS/390" ]]; then
-
作用 :检查当前操作系统是否为 IBM OS/390。
-
解释:OS/390 是 IBM 的大型机操作系统,需特殊处理。
bash
if [ -z $JOBNAME ]; then
JOBNAME="ZKEESTRT"
fi
-
作用 :若
JOBNAME
变量未定义,则将其设为默认值ZKEESTRT
。 -
解释 :在 OS/390 中,进程可能以作业(Job)形式运行,
ZKEESTRT
是 ZooKeeper 的默认作业名。
bash
PIDS=$(ps -A -o pid,jobname,comm | grep -i $JOBNAME | grep java | grep -v grep | awk '{print $1}')
-
作用:获取 ZooKeeper 进程的 PID。
-
解释:
-
ps -A -o pid,jobname,comm
:列出所有进程的 PID、作业名和命令。 -
grep -i $JOBNAME
:过滤包含JOBNAME
(不区分大小写)的行。 -
grep java
:进一步筛选 Java 进程。 -
grep -v grep
:排除grep
自身产生的行。 -
awk '{print $1}'
:提取第一列(PID)。
-
bash
elif [[ "$OSNAME" == "OS400" ]]; then
-
作用 :检查操作系统是否为 IBM OS/400(AS/400)。
-
解释:OS400 是 IBM 的中型机操作系统,需另一种处理方式。
bash
PIDS=$(ps -Af | grep java | grep -i QuorumPeerMain | grep -v grep | awk '{print $2}')
-
作用:获取 ZooKeeper 进程的 PID。
-
解释:
-
ps -Af
:显示完整格式的所有进程。 -
grep java
:筛选 Java 进程。 -
grep -i QuorumPeerMain
:查找 ZooKeeper 的主类QuorumPeerMain
(集群模式入口类)。 -
awk '{print $2}'
:提取第二列(PID),因为ps -f
的 PID 列在第二位。
-
bash
else
- 作用:处理其他类 Unix 系统(如 Linux、macOS)。
bash
PIDS=$(ps ax | grep java | grep -i QuorumPeerMain | grep -v grep | awk '{print $1}')
-
作用:获取 ZooKeeper 进程的 PID。
-
解释:
-
ps ax
:显示所有进程(包括其他用户的进程)。 -
grep java
:筛选 Java 进程。 -
grep -i QuorumPeerMain
:查找 ZooKeeper 主类。 -
awk '{print $1}'
:提取第一列(PID)。
-
bash
if [ -z "$PIDS" ]; then
echo "No zookeeper server to stop"
exit 1
-
作用:检查是否找到 ZooKeeper 进程。
-
解释 :若
PIDS
为空,输出提示信息并退出(状态码 1 表示错误)。
bash
else
kill -s $SIGNAL $PIDS
fi
-
作用:向 ZooKeeper 进程发送信号。
-
解释 :使用
kill
命令发送SIGNAL
(默认为TERM
)到所有找到的 PID,终止进程。