Linux 如何使用xargs运行nohup子流程池?
我试图使用参数化的hql脚本(foo_bar.hql)将大量原始数据加载到一些配置单元表中,但是原始数据是按/yyy/mm/dd进行目录分区的,因此我编写了一个shell脚本来打印带有日期参数的各个配置单元命令,每行一个。shell脚本输出如下所示:Linux 如何使用xargs运行nohup子流程池?,linux,bash,parallel-processing,hive,threadpool,Linux,Bash,Parallel Processing,Hive,Threadpool,我试图使用参数化的hql脚本(foo_bar.hql)将大量原始数据加载到一些配置单元表中,但是原始数据是按/yyy/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 -hiv
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输出传递到oblivion,这样它就不会阻塞东西,并且还会在后台启动hive命令)
如果单独运行,则每个命令都需要相当长的时间才能完成。我有很多需要运行的,所以我尝试通过使用xargs运行子进程池来并行化整个过程。我的用法如下:
bash bar_baz.sh | xargs-n1-I CMD-p5 bash-c CMD
出于我无法确定的原因,xargs-P5没有将并发子进程的数量限制为5,shell脚本打印到stout的所有命令都会同时执行,并且配置单元随后会崩溃。我觉得这与nohup有关,但在浏览了xargs和nohup的手册页并在互联网站上搜索类似的用法示例后,我仍然无法弄清楚发生了什么
任何帮助都将不胜感激!谢谢 解释
出于我无法确定的原因,xargs-p5没有将并发子进程的数量限制为5,shell脚本打印到stout的所有命令都会同时执行
实际上,它们被限制为5个,但是由于命令被立即发送到后台(由于shell脚本输出中的&
),由xargs启动的bash也会立即退出。因此,虽然xargs实际上一次最多运行5个进程,但它在很短的时间内启动了所有进程,因为它们只运行很短的时间
解决方案
我建议:
- 删除
–xargs依赖于未置于后台的进程&
- 要么:
- 如果可能,将xargs移动到
,或bar_baz.sh
- 将
放入另一个脚本中bash bar_baz.sh | xargs…
- 从单个命令中删除
nohup
- 使用
运行nohup
(1)或其他脚本(2)bar_baz.sh
- 可选:您还可以摆脱单个命令的输出重定向,因为您可以一次重定向整个脚本的输出
2>1&
——它必须是。解释
出于我无法确定的原因,xargs-p5没有将并发子进程的数量限制为5,shell脚本打印到stout的所有命令都会同时执行
实际上,它们被限制为5个,但是由于命令被立即发送到后台(由于shell脚本输出中的&
),由xargs启动的bash也会立即退出。因此,虽然xargs实际上一次最多运行5个进程,但它在很短的时间内启动了所有进程,因为它们只运行很短的时间
解决方案
我建议:
- 删除
–xargs依赖于未置于后台的进程&
- 要么:
- 如果可能,将xargs移动到
,或bar_baz.sh
- 将
放入另一个脚本中bash bar_baz.sh | xargs…
- 从单个命令中删除
nohup
- 使用
运行nohup
(1)或其他脚本(2)bar_baz.sh
- 可选:您还可以摆脱单个命令的输出重定向,因为您可以一次重定向整个脚本的输出
不相关,但这也是错误的:从STDERR到STDOUT的输出重定向不是
2>1&
–它必须是这样。尝试从文件中删除(&D)-P选项必须为youtry执行并行化以从文件中删除&-P选项必须为您执行并行化绝对是很棒的响应,我非常感谢您的解释!还感谢您指出这个输入错误-它解释了为什么我有一个名为1的文件,它看起来与以前的nohup.out文件非常接近…绝对是很棒的回答,我非常感谢您的解释!还感谢您指出这个输入错误-它解释了为什么我有一个名为1的文件,它看起来与以前的nohup.out文件非常接近。。。