Узел останавливается после начала запуска порожденного процесса - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь получить данные из порожденного процесса python, который прослушивает сокет домена unix, но каждый раз, когда я запускаю приложение узла, оно через некоторое время закрывается. Я попытался выполнить сценарий python без узла, и он работает правильно. Я также прочитал документацию по узлу https://nodejs.org/api/child_process.html и несколько постов, чтобы увидеть, что я делаю что-то не так, но все же у меня нет никакой подсказки. Сценарий узла, который я использовал, приведен ниже:

gateway. js

const { spawn } = require("child_process");
console.log("Spawing process");
let listener = spawn('python', ['./app_connection/dc_socket.py']);
listener.on('error', (err) => {
    console.log(err);
});
listener.stdout.on('data', (data) => {
    console.log(data.toString('utf8'));
});

, а сценарий python:

dc_socket.py

import socket
import logging
import os
import sys

REL_DEBUG_PATH = '../logs'
DEBUG_FILE_NAME = 'dc_socket.log'
BASE_PATH = os.path.dirname(__file__)
DEBUG_PATH = os.path.join(BASE_PATH, REL_DEBUG_PATH, DEBUG_FILE_NAME)

socket_logger = logging.getLogger(__name__)
debug_handler = logging.FileHandler(DEBUG_PATH)
debug_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
debug_handler.setFormatter(debug_format)
socket_logger.addHandler(debug_handler)
socket_logger.setLevel(logging.DEBUG)

# Datachannel messages will be intercepted by UV4L and will be published
# on the unix socket defined below
socket_path = '/tmp/uv4l.socket'
socket_logger.debug("Socket path: {}".format(socket_path))

try:
    os.unlink(socket_path)
except OSError:
    if os.path.exists(socket_path):
        socket_logger.error("Could not create socket.")
        raise

MESSAGE_SIZE = 1024 # bytes

# But we must create the socket in order to allow UV4L to send messages
socket_logger.debug("Initializing socket.")
with socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) as dc_socket:
    dc_socket.bind(socket_path)
    dc_socket.listen(1)
    socket_logger.debug("Listening on {}".format(socket_path))
    connection, address = dc_socket.accept()
    with connection:
        socket_logger.debug("Connected with {}".format(address))

        while True:
            message = connection.recv(MESSAGE_SIZE)
            if not message:
                break
            print(message) # Send message to parent process through stdout
            socket_logger.debug("Message: {}".format(message.decode('utf-8')))
            sys.stdout.flush()

Когда я запускаю приложение с node gateway.js, я получаю следующее:

$ node gateway.js 
Spawing process
$ 

И файл журнала для сценария python выглядит следующим образом:

dc_socket.log

2020-04-16 21:25:28,229 - __main__ - DEBUG - socket path: /tmp/uv4l.socket
2020-04-16 21:25:28,257 - __main__ - DEBUG - Initializing socket.

не доходит до установления соединения с сокетом, есть какие-либо подсказки о том, что может происходить? Я потратил довольно много времени, пытаясь понять это, но пока ничего.

...