Python 贝壳睡在';如果';陈述

Python 贝壳睡在';如果';陈述,python,bash,shell,sleep,Python,Bash,Shell,Sleep,我有一个运行python脚本的shell脚本, shell脚本包含许多“if”语句。 runner.sh([1=1]就是一个简单的例子)): 和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会

我有一个运行python脚本的shell脚本, shell脚本包含许多“if”语句。 runner.sh
[1=1]就是一个简单的例子)
):

和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(这就是为什么我有
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_名称,更好地显示它不是一个系统变量

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

sleep
命令正在工作;它们都是同时启动的,因为每个
if
语句都是在后台运行的。而且因为后台进程是异步的,所以不能保证它们按启动顺序完成。TLDR,这里没有任何问题。使用
-x
选项运行
bash
,以分析程序流。@chepner,是的,我的问题不够清楚,抱歉,我更新了它。我的问题是造成一些延迟,不允许同时启动所有进程。谢谢<代码>在启动后台作业之间休眠,而不是在每个后台作业中这正是我犯错误的地方。if-else块有不同的语句和不同的输入参数计数。但谢谢你,这是一个更伟大的解决方案!当您想在不同的if块中对所有不同的作业进行排队时,您可以将
test\u starter()
更改为
get\u sleeptime()
(每次调用多返回5秒)并在if块中执行
(sleep..)和
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