Убить процесс из Makefile - PullRequest
       182

Убить процесс из Makefile

2 голосов
/ 05 апреля 2011

Я пытаюсь написать make-файл, который будет копировать написанную мной клиент-серверную программу (на самом деле это всего лишь два сценария 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 - но я не был уверен, что это был правильный маршрут. Я не эксперт по make-файлам, может быть, я мог бы просто написать быстрый скрипт Python, который запускается из моего make-файла, чтобы выполнить работу за меня?предложения были бы хорошими.


РЕДАКТИРОВАТЬ :

Я написал сценарий сценария 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) 

Однако теперь я получаю ошибки, что мои глобальные переменные не определены (я думаю, что это напрямую связано с добавлением main методов к моим serversubscriber и client, но я нееще далеко. :) Это может заслуживать отдельного вопроса ...

Вот мой код сервера:

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)

Ответы [ 2 ]

5 голосов
/ 05 апреля 2011

Используйте в скрипте обычный старый bash, получите PID и используйте kill.

Или, что намного лучше, создайте сценарий тестирования, который обрабатывает все это и вызывает этот из вашего Makefile.Скажем, один run_tests.py.

Вы хотите сохранить как можно больше логики вне Makefile.

0 голосов
/ 05 апреля 2011

относится к «глобальной» проблеме => определить handle_client внутри main и удалить строку global message, client_count,...

...