我有一个运行python脚本的shell脚本,
shell脚本包含很多" if"声明。
runner.sh ([1=1] is just for example
)的简单示例:
if [ 1=1 ]; then
export DB_NAME="test_1"
sleep 5;
python ~/tmp/test_sleep/test.py $DB_NAME;
fi &
if [ 1=1 ]; then
export DB_NAME="test_2"
sleep 5;
python ~/tmp/test_sleep/test.py $DB_NAME;
fi &
if [ 1=1 ]; then
export DB_NAME="test_3"
sleep 5;
python ~/tmp/test_sleep/test.py $DB_NAME;
fi &
if [ 1=1 ]; then
export DB_NAME="test_4"
sleep 5;
python ~/tmp/test_sleep/test.py $DB_NAME;
fi
# wait for background processes to finish
CHILD_ERROR=0
for CHILD_PID in `pgrep -P $$`
do
# store child error if any
wait $CHILD_PID || CHILD_ERROR=$?
done
并且test.py:
from time import gmtime, strftime
import sys
print "%s at %s" % (sys.argv[1], strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()))
预计每个语句在执行前会休眠5秒,但是当我运行它时,我看到runner.sh等待5秒,然后在同一时间运行所有.py脚本:
test_2 at Sun, 04 Feb 2018 13:42:56 +0000
test_1 at Sun, 04 Feb 2018 13:42:56 +0000
test_3 at Sun, 04 Feb 2018 13:42:56 +0000
test_4 at Sun, 04 Feb 2018 13:42:56 +0000
所以问题是如何让睡眠工作在"如果"声明?
我不能在外面做,因为我需要检查很多(这就是为什么我有fi &
)
我知道所有ifs
在后台运行并且睡眠都在为每个进程工作,我只需要那些后台进程以一些睡眠延迟开始(每个语句都必须增加)。
例如,第一个为30秒,下一个为30秒,依此类推。
答案 0 :(得分:1)
您希望在之间开始后台作业,而不是 每个后台作业。
startJob1=1
startJob2=1
startJob3=1
startJob4=1
if [ "$startJob1" = 1 ]; then
python ~/tmp/test_sleep/test.py "test1" & job1Pid=$!
sleep 5
fi
if [ "$startJob2" = 1 ]; then
python ~/tmp/test_sleep/test.py "test2" & job2Pid=$!
sleep 5
fi
if [ "$startJob3" = 1 ]; then
python ~/tmp/test_sleep/test.py "test3" & job3Pid=$!
sleep 5
fi
if [ "$startJob4" = 1 ]; then
python ~/tmp/test_sleep/test.py "test4" & job4Pid=$!
fi
答案 1 :(得分:0)
如果要在开始时排队所有作业并让它们在不同时间启动,则必须具有不同的睡眠时间段。
我使用了一个函数,当每个if-blok都有类似的命令时
我添加set -x
仅用于调试目的。
我使用小写的db_name,更好地表明它不是系统var。
sleep_time=0
test_starter() {
export db_name="$1"
((sleep_time+=5))
echo " Queuing ${db_name}, starts over ${sleep_time} seconds"
(sleep ${sleep_time}; set -x; python ~/tmp/test_sleep/test.py ${db_name} )&
}
if [ 1=1 ]; then
test_starter "test_1"
fi
if [ 1=1 ]; then
test_starter "test_2"
fi
if [ 1=1 ]; then
test_starter "test_3"
fi
if [ 1=1 ]; then
test_starter "test_4"
fi
echo "Everything started"
# wait for background processes to finish
CHILD_ERROR=0
for CHILD_PID in `pgrep -P $$`
do
# store child error if any
wait $CHILD_PID || CHILD_ERROR=$?
done