我正在尝试构建一个脚本,它将从文件中验证列出的进程是否正在运行,如果正在运行,则应将其杀死。
该文件包含类似的列表:
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