1.场景
工作中遇到这样场景:一些异步执行的任务可能因为某些原因长时间不结束,一直占用内存影响其他服务的正常运行。临时应对这一问题可以使用脚本定时清理服务器上运行超时的进程。
2.代码
kill_process.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #!/bin/bash
# 定义超时时间(单位为秒) TIMEOUT=3600
# 定义要杀死的进程名称的关键字 PROCESS_KEYWORD="my_process"
# 定义自定义函数,用于杀死进程并打印进程信息 kill_and_print_info() { # 获取进程的PID、运行时间和占用内存 PID=$1 ETIMES=$(ps -p $PID -o etimes=) RSS=$(ps -p $PID -o rss=)
# 打印进程信息 echo "Killing process $PID (running for $ETIMES seconds, using $RSS KB of memory) at $(date)"
# 杀死进程 kill $PID }
# 循环查询运行超过$TIMEOUT秒的进程并杀死 while true do # 查找所有进程的信息 for pid in $(ps -eo pid,etimes,args | grep $PROCESS_KEYWORD | awk '$2 > '$TIMEOUT'{print $1}') do # 杀死进程并打印进程信息 kill_and_print_info $pid done
# 等待一段时间再进行下一次查询 sleep 300 done
|
3.使用
1 2 3 4
| # 授权 chmod 777 kill_process.sh # 启动 nohup ./kill_process.sh > kill_process.log &
|