gpt4 book ai didi

rust - 运行命令时如何避免僵尸进程?

转载 作者:行者123 更新时间:2023-11-29 08:08:45 28 4
gpt4 key购买 nike

一个小型 Iron 项目在某个路径中调用一个 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)并将响应返回给浏览器。一切都很好,但作为我的应用程序的子进程,僵尸进程仍然存在:

enter image description here

我不知道为什么,也不知道如何避免。 我能做什么?

wkhtmltopdf 命令是一个漫长的过程,我不想同步调用它并等待它返回。而且我不想每天两次重启我的 Rust 程序(僵尸 child 的 parent )来杀死僵尸。

最佳答案

您的问题是您没有等待进程终止,因此操作系统没有释放任何资源(参见 man pages for proper explanation)。你的僵尸正在占用内存,这将导致资源耗尽。杀死父进程不会做任何事情,你需要手动杀死每个僵尸(如果你在一个线程中运行 wkhtmltopdf,它会起作用)。


除此之外......

您正在尝试生成一个命令并回答您的客户......甚至没有检查 wkhtmltopdf 的状态代码。此外,您以 root 用户身份运行,这是一种错误的做法(无论您是否以 root 用户身份进行开发)。而且您的应用程序容易受到 DDoS 攻击(如果您有很多客户端生成 PDF,您的服务器将面临资源耗尽)。

(恕我直言)你应该把你的项目分成两部分:

  1. 没有渲染进程的服务器
  2. PDF 渲染引擎

第一个会向第二个发送消息“请生成具有以下参数的 PDF (..)”。第二个将查看消息队列,获取第一个,生成 PDF 并等待完成/错误。您甚至可以向消息添加一个唯一的#ID,并在渲染引擎上创建一个端点来实际查询作业#ID 的状态。

您正在尝试做的是像 Celery 这样的作业队列, 但它是用 Python 编写的,并使用第三方软件 (Redis)。

关于rust - 运行命令时如何避免僵尸进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38431488/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com