通过外壳中断杀死Python服务器



我有一个bash脚本,该脚本在后台运行了一些python脚本。我已经向他们附加了一个中断信号,因此当我ctrl-c时,我逃离了所有人。但是,我的python脚本启动了一个简单的httpserver。中断会杀死Python脚本,但不会杀死简单的Httpserver。我也将如何结束该过程?

我在main-script.sh中有以下外壳:

trap 'kill %1; kill %2' SIGINT
cd "$DIR_1" && ./script1.py &
cd "$DIR_2" && ./script2.py &
./script3.py 

Python脚本只需启动一个带有一些额外标题的简单HTTPSERVER即可。

在终端中运行ps x给出

60958 pts/1    S      0:00 /bin/bash ./main-script.sh
60959 pts/1    S      0:00 /bin/bash ./main-script.sh
60960 pts/1    S      0:02 /usr/bin/python ./script1.py host:port1
60962 pts/1    S      0:01 /usr/bin/python ./script2.py host:port2

和ctrl-c

之后
60960 pts/1    S      0:02 /usr/bin/python ./script1.py host:port1
60962 pts/1    S      0:01 /usr/bin/python ./script2.py host:port2

编辑此处是启动服务器的主要代码:

#!/usr/bin/python
import SimpleHTTPServer
import sys
from SimpleHTTPServer import SimpleHTTPRequestHandler
import BaseHTTPServer
def test(HandlerClass=SimpleHTTPRequestHandler,
         ServerClass=BaseHTTPServer.HTTPServer):
    protocol = "HTTP/1.0"
    server_address = (host, port)
    HandlerClass.protocol_version = protocol
    httpd = ServerClass(server_address, HandlerClass)
    httpd.serve_forever()
if __name__ == '__main__':
    test()

任何帮助将不胜感激。谢谢。

实际上不完全确定这有效,因为我在Windows上并且无法验证此功能。但是您的python实例应该是收到Ctrl-C信号的一个(或称为Sigint(。

有关此代码应在python中使用:

import signal
from sys import exit
from os import remove
def signal_handler(signal, frame):
    try:
        ## == Try to close any sockets etc nicely:
        ##    s in this case is an example of socket().
        ##    Whatever you got, put the exit stuff here.
        s.close() 
    except:
        pass
    ## == If you have a pid file:
    remove(pidfile)
    exit(1)
signal.signal(signal.SIGINT, signal_handler)
## == the rest of your code goes here

这应该捕获SIGINT并保持良好。
如果所有其他方法都失败了,则只会发生纯关闭。

相关内容

  • 没有找到相关文章

最新更新