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
我有一个 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