杀死文件中列出的多个进程

杀死文件中列出的多个进程

我正在尝试构建一个脚本,它将从文件中验证列出的进程是否正在运行,如果正在运行,则应将其杀死。

该文件包含类似的列表:

process01:0
process02:0
process03:0
process04:0
process05:0

笔记:其中一些进程以双重方式运行,因此这些列出的进程之一有不同的 2 或 3 个进程

例子:

user01@qhost0001:/home/user01>ps x
   PID TTY      STAT   TIME COMMAND
  3514 pts/2    S+     0:00 vim test_script.sh
  3844 pts/1    R+     0:00 ps x
 87844 pts/0    S+     0:00 -bash
100947 ?        S      0:00 sshd: user01@pts/1
100948 pts/1    Ss     0:00 -bash
101434 ?        S      0:00 sshd: user01@pts/2
101435 pts/2    Ss     0:00 -bash
127678 ?        S      0:00 process05 -c process05.cf
127869 ?        S      0:00 process01 -c process01.cf
127872 ?        S      0:00 process01 -c process01.cf
127879 ?        S      0:00 process03 -c process03.cf
127890 ?        S      0:00 process03 -c process03.cf
127904 ?        S      0:00 process03 -c process03.cf
128389 ?        S      0:00 process04 -c process04.cf

到目前为止我构建的脚本:

#!/bin/bash

proc_name=$(awk -F':' '{ print $1 }' /app/config/process_failures.cf)
PID=$(ps -ef | grep "$proc_name" | grep -v grep | grep -v PID | awk '{print $2}')

test() {
for p in $proc_name
do
  ps -ux | grep $p > /dev/null

if [ $? -eq 0 ]; then
        echo "Process $p is runnning."
        echo "Killing the processes"
        pgrep -f $p | xargs kill -9
        else
                echo "Process $p not running."
        fi

done
}

main() {

echo $PID
#test
}

main

当我执行查看返回回显的内容时,它返回的进程比文件列表中的进程多得多。它向我显示了主机中运行的所有进程。如果我更改为“ps -ux”,它会显示用户正在执行的所有进程,但它会显示其他进程,例如变量内的命令。

所以我没有明白我出错的地方。有人可以帮我澄清我错在哪里吗?

先感谢您

答案1

所以我在@White Owl 的帮助下得到了以下解决方案。我确实更改了进程列表文件的用法,因为我发现在不久的将来不会有新进程。所以我直接在脚本中创建了进程数组。

#!/bin/bash

processes=("main_mon" "sql_feed" "sql_intra" "sql_select" "topc" "iact" "isca" "iann" "dv2sql_so" "dv2sql_sorpc" "dv2sql_careo" "slamm" "slamm_mon" "dv2sql_socnt" "mmmtp" "ebus")

check_and_kill() {
for p in ${processes[@]};
do
  ps -ux | grep $p > /dev/null

if [ $? -ge 1 ]; then
        echo "Process $p is runnning."
        echo "Killing the processes"
        killall -s 9 -r $p -v
        else
                echo "No $p process is running."
        fi

done
}

main() {
check_and_kill
}

main

这是我找到的解决方案。谢谢

PS:开个玩笑,看来我与 awk 或 sed 的关系就像汤姆和杰瑞一样

答案2

如果您通过名称定义要终止的进程,那么您应该查看标准工具killall

所以要杀死所有 processXX 你会做类似的事情

killall -r "process[:digit:][:digit:]" --verbose

相关内容