Получить запущенный процесс 'stdin/stdout с помощью node.js

Я запускаю процесс из узла с child_process.spawn обработка событий данных process.stdout/stderr и запись на стандартный ввод.

Теперь мое приложение node может зависнуть или остановиться, когда оно перезапускается, я нахожу процесс по его PID, а затем я хотел бы снова подключиться к процессу stdin/stderr/stdout.

Рассматриваемый процесс может быть любой демоноподобной программой, поэтому я не могу контролировать ее поведение (например, я не могу настроить процесс для перенаправления его stdio при получении сигнала).

Я думаю обернуть процесс с помощью экрана, перенаправляя stdio в файл FIFO (но опция customFds устарела в узле 6), но ничто из этого не кажется таким чистым, как process.stdin.on...


person Gipsy King    schedule 17.11.2011    source источник
comment
Вы достигли своей цели? В конце концов, я удалю этот комментарий, но я искал что-то подобное, о чем вы просили, поэтому поделитесь ответом. Если у вас есть какие-то успехи!   -  person Leonardo Rick    schedule 14.08.2020


Ответы (1)


Может быть более простой способ, используя fuser. Я создал здесь ситуацию, когда node.js породил процесс и умер.

xxx@ubuntu:~/node$ node index.js 
Server has started
Request for / received.
About to route a request for /
Request handler 'start' was called

/home/xxx/node/requestHandlers.js:27
response.write(body);
            ^
ReferenceError: body is not defined
at Object.start (/home/xxx/node/requestHandlers.js:27:17)
at route (/home/xxx/node/node/router.js:4:18)
at Server.onRequest (/home/xxx/node/node/server.js:9:3)
at Server.emit (events.js:70:17)
at HTTPParser.onIncoming (http.js:1478:12)
at HTTPParser.onHeadersComplete (http.js:102:31)
at Socket.ondata (http.js:1374:22)
at TCP.onread (net.js:348:27)

Если я запускаю fuser <directory from which node started - пример fuser /opt/node, я вижу созданные мной pids

xxxx@ubuntu:~$ fuser node
node:                16490c 16491

Просто чтобы быть вдвойне уверенным - запустив ps, я вижу совпадающие pids

xxxx@ubuntu:~$ ps -ef | grep find | grep -v grep
xxxx     16490     1  0 17:39 pts/0    00:00:00 /bin/sh -c find / -name 'moo'    
xxxx     16491 16490 21 17:39 pts/0    00:00:04 find / -name moo

Я могу запустить fuser -k /opt/node, чтобы убить и очистить pids, начиная с /opt/node. Я лично регулярно использую fuser на работе и дома, чтобы очистить все оставшиеся процессы.

Я тестировал fuser на Ubuntu и Solaris.

ПРИМЕЧАНИЕ. Единственное, с чем вам нужно быть осторожным, это если в этом каталоге есть сеанс SSH, он будет уничтожен вместе с любым другим процессом, запущенным из этого каталога.

person First Zero    schedule 28.12.2011