2010-11-23 39 views
4

比方说,我有10个脚本,我想要定期运行cron作业。但是,我不希望所有人都在同一时间运行。我只想要其中两个同时运行。进程调度

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

是否有现有的unix工具来执行我上面提到的任务?

+0

你需要按照某种顺序执行这些脚本? – ajreal 2010-11-23 20:09:20

+0

@ajreal,不,我不需要特定的顺序 - 它们彼此独立。 – 2010-11-23 20:13:36

回答

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 
    "[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 
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 
} 

第一个参数是平行作业的数量。如果还有更多,则每个都作为一个工作运行,否则所有要运行的命令都是从stdin逐行读取的。

我使用一个命名管道(一旦shell打开它就会被遗忘)作为同步方法。由于只写入单个字节,因此不存在可能使事情复杂化的竞态条件问题。

+0

内建`wait`等待所有*子进程完成 – mob 2010-11-23 20:13:19