贝壳睡在里面的“如果'声明

时间:2018-02-04 13:58:29

标签: python bash shell sleep

我有一个运行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秒,依此类推。

2 个答案:

答案 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