通过 shell 中断杀死 python 服务器
Killing a python server through shell interrupt
我有一个 bash 脚本,它在后台运行一些 python 脚本。我给它们附加了一个中断信号,这样当我 ctrl-c 时,我就可以从它们中逃脱。但是,我的 python 脚本启动了一个 SimpleHTTPServer。中断将终止 python 脚本,但不会终止 SimpleHTTPServer。我将如何结束该过程?
我在 main-script.sh
中有以下 shell:
trap 'kill %1; kill %2' SIGINT
cd "$DIR_1" && ./script1.py &
cd "$DIR_2" && ./script2.py &
./script3.py
python 脚本只是启动一个带有一些额外 headers 的 SimpleHTTPServer。
运行 终端中的 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
并很好地停止。
如果所有其他方法都失败了,只会发生纯粹的关机。
我有一个 bash 脚本,它在后台运行一些 python 脚本。我给它们附加了一个中断信号,这样当我 ctrl-c 时,我就可以从它们中逃脱。但是,我的 python 脚本启动了一个 SimpleHTTPServer。中断将终止 python 脚本,但不会终止 SimpleHTTPServer。我将如何结束该过程?
我在 main-script.sh
中有以下 shell:
trap 'kill %1; kill %2' SIGINT
cd "$DIR_1" && ./script1.py &
cd "$DIR_2" && ./script2.py &
./script3.py
python 脚本只是启动一个带有一些额外 headers 的 SimpleHTTPServer。
运行 终端中的 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
并很好地停止。
如果所有其他方法都失败了,只会发生纯粹的关机。