Python Script создает каталоги в / tmp /, занимая системное пространство - PullRequest
0 голосов
/ 08 мая 2019

Я запускаю сценарий, который действует как сервер, позволяет двум клиентам подключаться к нему, а один конкретный клиент отправляет сообщение на сервер, сервер изменяет его, а затем отправляет его другому клиенту.

Похоже, это работает, так как клиент-получатель подтверждает, что ввод был получен и действителен.Это скрипт, который я намерен выполнять непрерывно.

Однако большая проблема заключается в том, что мой каталог / tmp / заполняется каталогами с именем _M... (эллипсы, представляющие случайную строку), которые содержат pythonмодули (такие как криптография, которые, насколько я знаю, я не использую), и информация о часовом поясе (буквально каждый часовой пояс, который поддерживает Python).Кажется, они создаются очень часто, но я не могу определить, что именно делает этот процесс.

Я создал работающий скрипт очистки bash, который удаляет файлы старше 5 минут из каталога каждые 5Однако в течение нескольких минут я не могу гарантировать, что при дублировании этого процесса для других устройств каталоги будут иметь одинаковое форматирование имени.Вместо того чтобы создавать уникальный сценарий bash для каждого процесса, который я создаю, я бы предпочел очистить каталоги из сценария python или, что еще лучше, предотвратить создание каталогов вообще.

Проблема в том, что я не уверен, как это сделать, и я не вижу в SO ничего относительно того, что создает эти каталоги, и как их удалять.

Ниже приведен мой сценарий

import time, socket, os, sys, re, select

IP = '192.168.109.8'
PORT = [3000, 3001]
PID = str(os.getpid())
PIDFILE = "/path/to/pidfile.pid"
client_counter = 0
sockets_list = []

def runCheck():
    if os.path.isfile(PIDFILE):
        return False
    else:
        with open(PIDFILE, 'w') as pidfile:
            pidfile.write(PID)
        return True

def openSockets():
    for i in PORT:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((IP, i))
        s.listen(1)
        sockets_list.append(s)

def receiveMessage(client_socket):
    try:
        message = client_socket.recv(2048).decode('utf-8')
        if not message:
            return False
        message = str(message)
        return message
    except:
        return False

def fixString(local_string):
    #processes
    return local_string

def main():
    try:
        openSockets()
        clients = {}
        print(f'Listening for connections on {IP}:{PORT[0]} and {PORT[1]}...')
        client_count = 0

        while True:
            read_sockets, _, exception_sockets = select.select(sockets_list, [], sockets_list)
            for notified_socket in read_sockets:
                if notified_socket == sockets_list[0] or notified_socket == sockets_list[1]:
                    client_socket, client_address = sockets_list[client_count].accept()
                    client_count = (client_count + 1) % 2
                    sockets_list.append(client_socket)
                    clients[client_socket] = client_socket
                    print('Accepted new connection from: {}'.format(*client_address))
                else:
                    message = receiveMessage(notified_socket)
                    if message is False:
                        continue

                    message = fixString(message)

                    for client_socket in clients:
                        if client_socket != notified_socket:
                            if message != "N/A":
                                client_socket.send(bytes(message, "utf-8"))
            for notified_socket in exception_sockets:
                sockets_list.remove(notified_socket)
                del clients[notified_socket]
            time.sleep(1)

    except socket.timeout:
        for i in sockets_list:
            i.close()
        os.remove(PIDFILE)
        sys.exit()
    except Exception as e:
        for i in sockets_list:
            i.close()
        err_details = str('Error in line {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e)
        os.remove(PIDFILE)
        print("Exception: {}".format(err_details))
        sys.exit()

if __name__ == "__main__":
    if runCheck():
        main()
    else:
        pass

Как я могу настроить его так, чтобы скрипт python удалял каталоги, которые он создает в каталоге / tmp /, или лучше, чтобы не создавать их в первую очередь?Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 09 мая 2019

Как оказалось, именно PyInstaller генерировал эти файлы. В документации говорится, что pyinstaller создает этот каталог _MEI при создании исполняемого файла в однофайловом режиме, и он также должен удалить его, но по какой-то причине он этого не сделал.

...