跳到主要内容

自己做个bench stop

需求背景:

有些场景下, 我们长期运行bench start ,但是关机后却没有kill掉 bench start的进程。

这样子导致bench start的进程就在后台hang住运行。 这种情况下我经常只能重启一下机器。 但是重启机器太麻烦了。

所以用gpt写了个脚本, 保留 22,3306,80 端口。 其他的端口进程全部kill。

更新:

2024-05-17 更新

后来发现没法再次执行bench start的原因是系统里头的 redis, python 进程依然在运行导致的。 可以通过如下的命令关闭一下即可。

frappe@899c031ceb4f:~/frappe-bench$ sudo pkill python redis
frappe@899c031ceb4f:~/frappe-bench$ netstat -lantp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.11:37866 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 464 192.168.32.2:22 192.168.8.135:50694 ESTABLISHED -
tcp6 0 0 :::22 :::* LISTEN -

做法:

#!/bin/bash

# 确保要保留的端口
keep_ports=(22 80 3306)

# 获取所有已监听的端口
all_ports=$(netstat -lnt | awk 'NR>2 {split($4, a, ":"); print a[2]}')

# 终止不需要的端口对应的进程
for port in $all_ports; do
found=0
for keep_port in ${keep_ports[@]}; do
if [ "$port" -eq "$keep_port" ]; then
found=1
break
fi
done
if [ $found -eq 0 ]; then
echo "Terminating processes on port $port"
fuser -k -n tcp $port
fi
done

echo "Processes terminated."

执行:

frappe@e8811978c502:/home/test$ sudo bash ./kill.bench.start.sh 
Terminating processes on port 42630
42630/tcp: 879
Terminating processes on port 46025
46025/tcp: 440
Terminating processes on port 40145
Terminating processes on port 4341
4341/tcp: 56186 56187 56188 56189 56190 56191 56192 56193 56194
Terminating processes on port 4342
Terminating processes on port 4343
Terminating processes on port 4344
Terminating processes on port 8000
8000/tcp: 108489
Terminating processes on port 4321
Processes terminated.