2010-11-23 62 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