[英]Kill Process from Makefile
我正在嘗試編寫一個可以復制我編寫的客戶端/服務器程序的makefile(實際上只是兩個Python腳本,但這不是真正要關注的問題)...
test:
python server.py 7040 &
python subscriber.py localhost 7040 &
python client.py localhost 7040;
所以我make test
我可以從client.py
輸入消息:
python server.py 7040 &
python subscriber.py localhost 7040 &
python client.py localhost 7040;
Enter a message:
client
輸入空消息時,他關閉連接並成功退出。 現在,我該如何自動關閉聊天室的subscriber
(他只是“偵聽器”),這將退出server
進程。
我試圖使用pidof
從這些調用中獲取進程pidof
但不確定是否是正確的路由。 我不是makefile專家; 也許我可以編寫一個快速的Python腳本,該腳本從我的makefile中執行以為我完成工作? 任何建議都很好。
編輯 :
我已經寫了Python腳本路線,並具有以下內容:
import server
import client
import subscriber
#import subprocess
server.main(8092)
# child = subprocess.Popen("server.py",shell=False)
subscriber.main('localhost',8090)
client.main('localhost', 8090)
但是,現在我得到的錯誤是我的全局變量未定義(我認為這與向server
(以及subscriber
和client
添加main
方法直接相關,但我還沒走那么遠:)。一個單獨的問題...
這是我的服務器代碼:
import socket
import select
import sys
import thread
import time
# initialize list to track all open_sockets/connected clients
open_sockets = []
# thread for each client that connects
def handle_client(this_client,sleeptime):
global message,client_count,message_lock,client_count_lock
while 1:
user_input = this_client.recv(100)
if user_input == '':
break
message_lock.acquire()
time.sleep(sleeptime)
message += user_input
message_lock.release()
message = message + '\n'
this_client.sendall(message)
# remove 'this_client' from open_sockets list
open_sockets.remove(this_client)
this_client.close()
client_count_lock.acquire()
client_count -= 1
client_count_lock.release()
def main(a):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = a
server.bind(('', port))
server.listen(5)
message = ''
message_lock = thread.allocate_lock()
client_count = 2
client_count_lock = thread.allocate_lock()
for i in range(client_count):
(client,address) = server.accept()
open_sockets.append(client)
thread.start_new_thread(handle_client,(client,2))
server.close()
while client_count > 0:
pass
print '************\nMessage log from all clients:\n%s\n************' % message
if __name__ == "__main__":
if sys.argv[1]:
main(int(sys.argv[1]))
else:
main(8070)
在腳本中使用普通的舊bash,獲取PID並使用kill
。
或者,更好的是,創建一個處理所有內容的測試腳本,並從您的Makefile中調用它 。 比如說一個run_tests.py。
您希望在Makefile之外保持盡可能多的邏輯。
與'global'問題有關=>在main
內部定義handle_client
並刪除global message, client_count,...
行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.