流程调度

时间:2010-11-23 19:55:44

标签: bash cron

让我们说,我有10个脚本,我想定期作为cron作业运行。但是,我不希望所有这些都同时运行。我只希望其中两个同时运行。

我正在考虑的一个解决方案是创建两个脚本,在每个脚本上放置5个语句,并将它们作为crontab中的单独条目。然而,解决方案似乎非常特别。

是否存在执行上述任务的unix工具?

3 个答案:

答案 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_stuffdo_other_stuff完成时运行。

观看介绍视频以了解更多信息:

http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1