#!/bin/bash
# 查找 nginx 进程的 PID
PID=$(ps aux | grep '[x]xl-job-admin' | awk '{print $2}')
# 终止进程
if [ -n "$PID" ]; then
kill -9 "$PID"
echo "已终止 xxl-job-admin 进程:$PID"
else
echo "未找到 xxl-job-admin 进程。"
fi
# Java VM Params
JAVA_OPTS=""
java $JAVA_OPTS -jar /home/shenjy/xxl-job/xxl-job-admin/xxl-job-admin-2.3.0.jar &
注释:可以通过修改 grep 的匹配模式,避免匹配到 grep 自身。
# 使用 [x]xl-job-admin
ps -ef | grep '[x]xl-job-admin'
# 不使用 xxl-job-admin
ps -ef | grep xxl-job-admin
具体解释如下面描述:
在执行 ps -ef | grep xxl-job-admin 时,grep 命令会匹配到自身的原因是因为 grep 的命令行中包含了 xxl-job-admin 这个字符串。以下是详细解释:
1. ps -ef 的输出
ps -ef 会列出系统中所有进程的详细信息,包括每个进程的命令行。例如:
UID PID PPID C STIME TTY TIME CMD
root 389152 366070 82 15:43 pts/3 00:00:20 java -jar xxl-job-admin-2.3.0.jar
root 389609 372484 0 15:44 pts/7 00:00:00 grep --color=auto xxl-job-admin
- 第一行是
xxl-job-admin进程。 - 第二行是
grep命令本身。
2. grep 的工作原理
grep 会逐行扫描输入(这里是 ps -ef 的输出),并匹配包含指定模式(这里是 xxl-job-admin)的行。
- 当
grep扫描到xxl-job-admin进程时,会匹配并输出这一行。 - 当
grep扫描到自己的命令行时,也会匹配并输出这一行,因为它的命令行中包含xxl-job-admin。
3. 为什么 grep 会匹配到自己?
grep 的命令行是:
grep --color=auto xxl-job-admin
- 这个命令行中包含了
xxl-job-admin,因此grep会匹配到自己。
4. 如何避免匹配到 grep 自身?
可以通过修改 grep 的匹配模式,使其不会匹配到自己的命令行。例如:
ps -ef | grep '[x]xl-job-admin'
- 原理:
[x]xl-job-admin会匹配xxl-job-admin,但不会匹配grep xxl-job-admin,因为grep的命令行是grep --color=auto xxl-job-admin,而[x]xl-job-admin不会匹配到grep。
5. 优化后的命令
ps -ef | grep '[x]xl-job-admin'
- 输出:
root 389152 366070 82 15:43 pts/3 00:00:20 java -jar xxl-job-admin-2.3.0.jar
这样只会输出 xxl-job-admin 进程的信息,而不会包含 grep 自身。
总结
- 原因:
grep的命令行中包含xxl-job-admin,因此会匹配到自己。 - 解决方法:使用
grep '[x]xl-job-admin'避免匹配到grep自身。 - 核心原理:通过修改匹配模式,使
grep不会匹配到自己的命令行。