[英]Distributing lines of commands using bash script
我正在尝试实现简单的并行化,其中命令行分布在不同的进程中。 为此我写了这个脚本,我命名为jobsel
:
(only "#! /bin/bash" and help message is omitted)
slots=$1
sel=$2
[[ $slots -gt 0 ]] || die_usage
[[ $sel -lt $slots ]] || die_usage
i=0
while read line
do
(( i % slots == sel )) && eval $line
i=$(( i + 1 ))
done
# in case the last line does not end with EOL
if [[ $line != "" ]]; then
(( i % slots == sel )) && eval $line
i=$(( i + 1 ))
fi
我把eval
因为没有它我不能在命令中使用重定向或管道。
当我在控制台模拟器上运行这个像$HOME/util/jobsel 22 0 < cmds
时,当cmds
是一个包含echo 0 >> out
和更多数字的行的文件时,它会按预期输出$HOME/util/jobsel 22 0 < cmds
0, 22, 44...
在单独的行。 目前很好。
所以我把它付诸实践。 但是,当我跑这通过安全壳,我跑它通过at
与backgrounding(截止到每一行&
)。 然后有一个问题。 当我输入8行时,开始了21个进程! ps -AFH
打印的进程具有相同的命令和不同的pID。 所有工作流程都直接在init下处于同一级别。 我的程序无论如何都不会创建子进程。
困惑,我尝试了echo 0 >> out
脚本at
然后输出包含重复的行。 仍然觉得很难相信,并且考虑同时追加可能会导致异常,我使用其他方法来确认某些行已经多次运行。
此外,当所有东西都在终端中运行或者我为每个工作进程创建单独at
工作时,没有这样的异常。
但这怎么可能发生呢? 我的脚本有问题吗? at/atd
有一些错误吗?
GNU parallel是你想要实现的。
提示:它与xargs结合得非常好
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.