shell 在 'if' 语句中休眠

shell sleep inside the 'if' statement

我有一个 shell 脚本 运行 一个 python 脚本, 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

所以问题是如何在 "if" 语句中使 sleep 起作用? 我不能到外面去,因为我需要检查很多 if(这就是为什么我有 fi &

我知道所有 ifs 运行 的后台和睡眠工作都适用于每个进程,我只需要这些后台进程以一些睡眠延迟开始(每个语句都必须增加) .

例如第一个 30 秒,下一个 +30 秒,依此类推。

您想 启动后台作业之间休眠,而不是 每个后台作业中休眠。

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

当你想在开始时对所有作业进行排队并让它们在不同时间开始时,你必须有不同的睡眠周期。

我使用了一个函数,当每个 if-blok 都有相似的命令时,这个函数是可能的。
我添加 set -x 仅用于调试目的。 我使用小写的 db_name,更好地表明它不是系统变量。

sleep_time=0

test_starter() {
    export db_name=""
    ((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