在linux shell中,我可以运行以下命令来杀死由python脚本(由sudo python3 server.py
开头)创建的每个进程:
sudo kill -9 `ps -ef | grep server.py |grep -v "grep"|awk '{{print $2}}'
我想将此添加到脚本中,并在启动时结束所有以前的脚本过程,以避免出现套接字“地址已在使用中”错误。
这是我的代码:
try:
application.listen(port=63)
except OSError as e:
if e.errno == errno.EADDRINUSE:
cmd = 'sudo kill -9 `ps -ef | grep server.py |grep -v "grep"|awk \'{{print $2}}\'`'
print('try to kill previous',cmd)
import os
os.system(cmd)
问题在于这也会杀死新进程,因为它也是由相同的关键字启动的。
如何避免这种情况?
最佳答案
不用按名称杀死该程序,您只需
杀死正在端口63上监听的程序。
以下命令为您提供了侦听端口63的程序的PID
netstat --numeric-ports --listening --program | awk '{if (match($4, ":63$")) { split($NF, a, "/"); print a[1];}}'
或更短的形式:
netstat -nlp | awk '{if (match($4, ":63$")) {split($NF, a, "/"); print a[1];}}'
将所有内容粘在一起,以杀死在端口63上监听的程序的命令如下:
sudo kill -9 `netstat -nlp | awk '{if (match($4, ":63$")) {split($NF, a, "/"); print a[1];}}'`
这里的解释:
netstat -nlp
输出在某些端口上侦听的所有程序,而无需解析端口名。这样就得到了这样的东西:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 2096/php-fpm.conf)
tcp 0 0 127.0.0.1:63 0.0.0.0:* LISTEN 2263/memcached
tcp 0 0 0.0.0.0:36815 0.0.0.0:* LISTEN 1748/rpc.statd
....
awk命令的含义如下:
awk '{
# check if field "Local Address" ends with ":63"
if (match($4, ":63$")) {
# split the field "PID/Program name"
# into the array a based on delimiter "/"
split($NF, a, "/");
# print the PID
print a[1];
}
}'