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

sg3maiej  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(271)

我正试图使用参数化的hql脚本(foo\u bar.hql)将大量的原始数据加载到一些配置单元表中,但是原始数据是按/yyyy/mm/dd进行目录分区的,因此我编写了一个shell脚本来打印带有日期参数的各个配置单元命令,每行一个。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& &
...

(the) >/dev/null 2>1& & part将nohup.out输出传递到oblivion中,这样它就不会阻塞东西,并且还会在后台启动hive命令)
如果单独运行,每个命令都需要相当长的时间才能完成。我有很多需要运行的程序,所以我尝试通过使用xargs运行子进程池来并行化整个程序。我的用法如下: bash bar_baz.sh | xargs -n 1 -I CMD -P 5 bash -c CMD 由于我无法确定的原因,xargs-p5没有将并发子进程的数量限制为5,shell脚本打印到stout的所有命令都会同时执行,而hive随后会崩溃。我觉得这和nohup有关,但是在浏览了xargs和nohup的手册页并在互联网上搜索类似的用法示例之后,我仍然不知道发生了什么。
任何帮助都将不胜感激!谢谢!

eeq64g8w

eeq64g8w1#

解释

由于我无法确定的原因,xargs-p5没有将并发子进程的数量限制为5,shell脚本打印到stout的所有命令都会同时执行,
实际上它们被限制为5个,但是由于命令被立即发送到后台(由于 & 在shell脚本的输出中,xargs启动的bash也会立即退出。因此,虽然xargs实际上一次最多运行5个进程,但它在很短的时间内启动了所有进程,因为它们只运行了很短的时间。

解决方案

我建议:
拆下 & –xargs依赖于不放在后台的进程
或者:
将xargs移到 bar_baz.sh 如果可能,或
bash bar_baz.sh | xargs … 变成另一个剧本
删除 nohup 从单个命令
bar_baz.sh (1) 或另一个脚本(2)与 nohup 相反
可选:您还可以摆脱单个命令的输出重定向,因为您可以一次重定向整个脚本的输出

旁注

不相关,但这也是错误的:从stderr到stdout的输出重定向不正确 2>1& –必须这样 2>&1 .

相关问题