Python 贝壳睡在';如果';陈述
我有一个运行python脚本的shell脚本, shell脚本包含许多“if”语句。 runner.sh(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会
[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