检查进程并在运行时终止

use*_*309 3 shell process ps

我试图找出一个进程是否正在运行,如果它正在运行,那么我想调用一个脚本或打印一些东西。我尝试了以下几种方法,但它给了我语法错误或找不到命令错误。

APP_ID = ps -eaf | grep -i `whoami` | grep -i <process_name> | grep -i java | awk '{print$2}'

if[''!= '${APP_ID}'] then
    echo "Stopping instance $APP_ID"
Run Code Online (Sandbox Code Playgroud)

我得到的结果如下:

test.sh: line 15: APP_ID: command not found
test.sh: line 17: if[!= ${APP_ID}]: command not found
Stopping instance 
Run Code Online (Sandbox Code Playgroud)

上面的脚本有什么问题?如果它有一些错误,那么为什么它会echoif条件中打印?

下面的脚本也没有说 test.sh: line 3: [ps: command not found

if [ps -eaf | grep -i `whoami` | grep -i <process_name> | grep -i java]; then
    echo 'stop'
fi
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 10

你的语法有很多问题:

所以这里是固定的脚本:

APP_ID=$(ps -C whoami --no-header --format 'pid')

if [ -n "${APP_ID}" ]; then
    echo "Stopping instance $APP_ID"
fi
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 5

pgrep使用and可以最简单地完成此操作pkill

if pgrep process_name 2>/dev/null; then
  echo "Terminating process_name"
  pkill process_name
fi
Run Code Online (Sandbox Code Playgroud)

process_name 正如用户 @OrangeDog 在评论中指出的那样,如果进程在调用pgreppkill之间产生,则该 shell 代码理论上有可能无法终止进程。在这种情况下,pgrep将不会检测到该进程并且pkill永远不会执行。这个问题有多大,我不知道。如果该进程在语句之后立即生成,您能做什么?

做就是了

echo "terminating process_name (if it is running)"
pkill process_name
Run Code Online (Sandbox Code Playgroud)

无论如何都要摆脱讨厌的竞争条件。