比方说,我有10个脚本,我想要定期运行cron作业。但是,我不希望所有人都在同一时间运行。我只想要其中两个同时运行。进程调度
我想到的一个解决方案是创建两个脚本,在每个脚本上放置5个语句,并将它们作为crontab中的单独条目。然而,解决方案似乎非常专业。
是否有现有的unix工具来执行我上面提到的任务?
比方说,我有10个脚本,我想要定期运行cron作业。但是,我不希望所有人都在同一时间运行。我只想要其中两个同时运行。进程调度
我想到的一个解决方案是创建两个脚本,在每个脚本上放置5个语句,并将它们作为crontab中的单独条目。然而,解决方案似乎非常专业。
是否有现有的unix工具来执行我上面提到的任务?
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
"[email protected]" &
}
launch_when_not_busy bash job1.sh --args
launch_when_not_busy bash jobTwo.sh
launch_when_not_busy bash job_three.sh
...
wait
注意:正如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
}
第一个参数是平行作业的数量。如果还有更多,则每个都作为一个工作运行,否则所有要运行的命令都是从stdin逐行读取的。
我使用一个命名管道(一旦shell打开它就会被遗忘)作为同步方法。由于只写入单个字节,因此不存在可能使事情复杂化的竞态条件问题。
内建`wait`等待所有*子进程完成 – mob 2010-11-23 20:13:19
GNU并行是专为这类任务:当任do_stuff
或do_other_stuff
完成
sem -j2 do_stuff
sem -j2 do_other_stuff
sem -j2 do_third_stuff
do_third_stuff
才会运行。
观看介绍视频,以了解更多:
你需要按照某种顺序执行这些脚本? – ajreal 2010-11-23 20:09:20
@ajreal,不,我不需要特定的顺序 - 它们彼此独立。 – 2010-11-23 20:13:36