比方說,我有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