在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];

       }
  }'

10-08 05:40
查看更多