让我们说,我有10个脚本,我想定期作为cron作业运行。但是,我不希望所有这些都同时运行。我只希望其中两个同时运行。
我正在考虑的一个解决方案是创建两个脚本,在每个脚本上放置5个语句,并将它们作为crontab中的单独条目。然而,解决方案似乎非常特别。
是否存在执行上述任务的unix工具?
答案 0 :(得分:1)
注意:正如mobrule所指出的,我原来的答案是行不通的,因为没有参数的内置等待所有孩子完成。因此,下面的'parallelexec'脚本避免了以更多子进程为代价的轮询:
#!/bin/bash
N="$1"
I=0
{
if [[ "$#" -le 1 ]]; then
cat
else
while [[ "$#" -gt 1 ]]; do
echo "$2"
set -- "$1" "${@:3}"
done
fi
} | {
d=$(mktemp -d /tmp/fifo.XXXXXXXX)
mkfifo "$d"/fifo
exec 3<>"$d"/fifo
rm -rf "$d"
while [[ "$I" -lt "$N" ]] && read C; do
($C; echo >&3) &
let I++
done
while read C; do
read -u 3
($C; echo >&3) &
done
}
第一个参数是并行作业的数量。如果还有更多,则每个都作为作业运行,否则所有要运行的命令都是逐行读取的。
我使用命名管道(一旦shell打开它就被发送到遗忘)作为同步方法。由于只写入单个字节,因此没有可能使事情复杂化的竞争条件问题。
答案 1 :(得分:1)
jobs
内置函数可以告诉您正在运行的子进程数。一些简单的shell脚本可以完成这项任务:
MAX_JOBS=2
launch_when_not_busy()
{
while [ $(jobs | wc -l) -ge $MAX_JOBS ]
do
# at least $MAX_JOBS are still running.
sleep 1
done
"$@" &
}
launch_when_not_busy bash job1.sh --args
launch_when_not_busy bash jobTwo.sh
launch_when_not_busy bash job_three.sh
...
wait
答案 2 :(得分:1)
GNU Parallel专为此类任务而设计:
sem -j2 do_stuff
sem -j2 do_other_stuff
sem -j2 do_third_stuff
do_third_stuff
只会在do_stuff
或do_other_stuff
完成时运行。
观看介绍视频以了解更多信息: