我如何 运行 使用 xargs 的 nohup 子进程池?
How can I run a nohup subprocess pool using xargs?
我正在尝试使用参数化的 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 脚本输出中的 &
),bash由 xargs 启动的也会立即退出。因此,虽然 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
.
我正在尝试使用参数化的 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 脚本输出中的 &
),bash由 xargs 启动的也会立即退出。因此,虽然 xargs 实际上 运行 同时最多 5 个进程,但它在很短的时间内启动了它们,因为它们 运行 只持续了这么短的时间。
解决方案
我建议:
- 删除
&
– xargs 依赖进程 而不是 被放入后台 - 或者:
- 如果可能,将 xargs 移动到
bar_baz.sh
,或者 - 将
bash bar_baz.sh | xargs …
放入另一个脚本
- 如果可能,将 xargs 移动到
- 从单个命令中删除
nohup
- 运行
bar_baz.sh
(1) 或其他脚本 (2)nohup
而不是 - 可选:您还可以摆脱单个命令的输出重定向,因为您可以一次重定向整个脚本的输出
旁注
无关,但这也是错误的:从 STDERR 到 STDOUT 的输出重定向不是 2>1&
– 它必须是 2>&1
.