#node.js #child-process #spawn
#node.js #дочерний процесс #порождение
Вопрос:
Зачем мне это нужно?
- Клиент отправляет запрос на сервер
- Сервер получает запрос, запускает скрипт python с spawn (child_process)
- Если скрипту python требуется дополнительная информация для продолжения работы, я должен отправить пользователю электронное письмо со ссылкой, которая ведет на страницу только с одним полем ввода
- Когда пользователь заполняет это, я должен продолжить ТОТ ЖЕ процесс (запуск скрипта) и ввести его в командной строке с помощью ls = spawn(‘command’, аргументы), а затем ls.stdin.write()
Как я могу это сделать? Моя идея заключается в том, чтобы получить объект из
const { spawn } = require('child_process');
const ls = spawn('command', [args]);
insertInDb(JSON.stringify(ls));
А затем использовать его с
const ls = JSON.parse(databaseInput);
ls.stdin.write(input);
Но это не работает.
Ответ №1:
Нет, но я не могу представить сценарий, в котором вы хотели бы. Что, если ваш пользователь отправит электронное письмо завтра? Или на следующей неделе? Или никогда? У вас просто есть эти зависшие процессы python, засоряющие вашу систему.
Если вы уверены, что получите быструю обратную связь, вы можете обсудить свой скрипт на python с помощью общего файлового дескриптора:
const cp = spawn(cmd,args,{
stdio:['pipe','pipe','pipe','pipe']
});
cp.stdio[3].on('data',(data)=>{
// data from python's fd 3
});
cp.stdio[3].write('foobar'); // write to python's fd 3
Но у вас почти наверняка должно быть два разных скрипта python.
Комментарии:
1. Это сторонний скрипт, который произвел некоторую очистку, и иногда ему требуется дополнительная информация, которую пользователь должен ввести. Это не должно длиться более 5 минут
2. Это не очень хорошее решение. Вы должны проверить наличие необходимой информации перед ее запуском или разделением. Несмотря на то, что это сторонний сценарий, вы все равно можете легко изменить его. Как насчет этого: найдите свое место разделения и запишите переменные в формате JSON. Сохраните его на своем сервере, исправьте переменные, если необходимо, запустите вторую половину с переменными в качестве переменных env или значений argv.
3. Значит, невозможно сохранить как строковый объект spawn?
4. Что ж, очень мало невозможного при некотором творческом подходе и четком понимании того, что вам нужно, но вы не должны этого делать.
5. Или я могу отправить stdin на существующий pid? Сохранение только pid