簡體   English   中英

從Makefile殺死進程

[英]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 (以及subscriberclient添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM