Небольшой проект железной дороги вызывает Command
в некотором маршруте и возвращает Response
. Вот соответствующий код функции обработчика маршрута:Как избежать процессов зомби при запуске команды?
fn convert(req: &mut Request) -> IronResult<Response> {
// ...
// init some bindings like destination_html and destination_pdf
// ...
convert_to_pdf(destination_html, destination_pdf);
Ok(Response::with((status::Ok, "Done")))
}
И код вызываемой функции:
fn convert_to_pdf(destination_html: &str, destination_pdf: &str) {
Command::new("xvfb-run")
.arg("-a")
.arg("wkhtmltopdf")
.arg(destination_html)
.arg(destination_pdf)
.stdout(Stdio::null())
.stderr(Stdio::null())
.spawn()
.expect("failed to execute process");
}
Процесс работает (файл преобразуется из HTML в PDF) и ответ вернулся в браузер. Все это хорошо, но процесс зомби все еще там, как ребенок моего приложения:
Я не знаю, почему и я не знаю, как избежать этого. Что мне делать?
Команда wkhtmltopdf
- это долгий процесс, я не хочу называть его синхронно и ждать его возвращения. И я не хочу перезапускать мою программу Rust (родителя ребенка-зомби) два раза в день, чтобы убить зомби.
Не ответ на ваш вопрос, но я начал работать с привязками wkhtmltopdf к C-lib, где нереста отдельного процесса вообще не понадобится. Не готово к производству, но вы можете найти доказательство концепции здесь: https://github.com/anowell/wkhtmltopdf-rs – anowell
Хорошо! Я посмотрю и, возможно, буду использовать его для этого проекта! –