gpt4 book ai didi

linux - 如何使用 xargs 运行 nohup 子进程池?

转载 作者:太空宇宙 更新时间:2023-11-04 09:18:17 27 4
gpt4 key购买 nike

我正在尝试使用参数化的 hql 脚本 (foo_bar.hql) 将大量原始数据加载到一些配置单元表中,但是原始数据是按/yyyy/mm/dd 进行目录分区的,所以我写了一个用于打印带有日期参数的单个配置单元命令的 shell 脚本,每行一个到 stout。 shell 脚本输出如下所示:

nohup hive -f foo_bar.hql -hiveconf MONTH=06 -hiveconf DAY=01 >/dev/null 2>1& &
nohup hive -f foo_bar.hql -hiveconf MONTH=06 -hiveconf DAY=02 >/dev/null 2>1& &
nohup hive -f foo_bar.hql -hiveconf MONTH=06 -hiveconf DAY=03 >/dev/null 2>1& &
nohup hive -f foo_bar.hql -hiveconf MONTH=06 -hiveconf DAY=04 >/dev/null 2>1& &
...

(>/dev/null 2>1& & 部分将 nohup.out 输出传递到遗忘状态,这样它就不会阻塞,并且还会在后台启动 hive 命令)

如果单独运行,这些命令中的每一个都需要相当长的时间才能完成。我有很多需要运行的东西,所以我试图通过使用 xargs 运行子进程池来并行化整个过程。我的用法如下:

bash bar_baz.sh | xargs -n 1 -I CMD -P 5 bash -c CMD

出于我无法确定的原因,xargs -P 5 没有将并发子进程的数量限制为 5,所有由 shell 脚本打印到 stout 的命令同时执行,Hive 随后崩溃。我觉得这与 nohup 有关,但在查看了 xargs 和 nohup 的手册页并在互联网上搜索类似的使用示例后,我仍然无法弄清楚发生了什么。

任何帮助将不胜感激!谢谢!

最佳答案

说明

For a reason I cannot ascertain, xargs -P 5 doesn't limit the number of concurrent subprocesses to 5, ALL of the commands printed to stout by the shell script get executed simultaneously,

实际上它们限制为 5,但由于命令会立即发送到后台(由于 shell 脚本输出中的 &),由 xargs 启动的 bash 会立即退出, 也。因此,虽然 xargs 实际上一次最多运行 5 个进程,但它会在很短的时间内启动它们,因为它们运行的​​时间很短。

解决方案

我建议:

  • 删除 & – xargs 依赖于被放入后台的进程
  • 要么:
    1. 如果可能,将 xargs 移动到 bar_baz.sh,或者
    2. bash bar_baz.sh | xargs … 到另一个脚本
  • 从单个命令中删除 nohup
  • 运行 bar_baz.sh (1) 或使用 nohup 的其他脚本 (2)
  • 可选:您还可以摆脱单个命令的输出重定向,因为您可以一次重定向整个脚本的输出

旁注

无关,但这也是错误的:从 STDERR 到 STDOUT 的输出重定向不是 2>1& – 它必须是 2>&1 .

关于linux - 如何使用 xargs 运行 nohup 子进程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44707413/

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