我有一个名为hdsr_writer.py的python脚本。我可以通过调用
在shell中启动这个脚本"python hdsr_writer.py 1234"
其中1234是参数。
我创建了一个shell脚本来增加数量并使用每1秒的数字执行python脚本
for param from 1 to 100000
python hdsr_writer.py $param &
sleep (1)
通常,python脚本在0.5秒内执行其任务。但是,有时候python脚本会卡住并驻留在系统中超过30秒。我不想要那个。所以我想监视每个执行的python进程的生命周期。如果它停留的时间超过2秒,它将被杀死并最多重复执行2次。
注意:我想在shell脚本而不是python脚本中执行此操作,因为我无法更改python脚本。
更新:关于我的问题的更多解释
请注意:启动新的python进程并监视python进程是独立的作业。启动工作并不关心有多少python进程正在运行以及如何" old"他们只是打电话给#34; python hdsr_writer.py $ param&"增加参数后每1秒钟。另一方面,监视作业会定期检查所有hdsr_writer python进程的生命周期。如果一个人在内存中停留超过2秒,则将其杀死,并最多重新运行2次。
答案 0 :(得分:0)
使用sleep和nohup命令的组合。睡眠时间后使用kill来完成python脚本的执行。您可以使用ps命令检查进程是否正在运行。
#!/usr/bin/ksh
for param from {1..100000}
nohup python hdsr_writer.py $param &
pid=$!
sleep(2)
if [ ps -p $pid ]
then
kill -9 $pid
fi
done
再应答:
我使用两个脚本,第一个脚本(script1.ksh):
#!/usr/bin/ksh
for param from {1..1000000}
nohup script2.sh $param &
done
第二个(script2.ksh):
#!/usr/bin/ksh
for i from {1..3}
python hsdr_write.py $1 &
pid=$!
sleep(2)
if [ ps -p $pid ]
then
kill -9 $pid
else
echo 'Finalizado'$1 >> log.txt
return
fi
done
第一个脚本将一个接一个地启动您的所有进程。第二个将检查他自己的python进程。
答案 1 :(得分:0)
答案不是那么简短
#/bin/bash
param=1
while [[ $param -lt 100000 ]]; do
echo "param=$param"
chances=3
while [[ $chances -gt 0 ]]; do
python tst.py $param &
sleep 2
if [[ "$(jobs | grep 'Running')" == "" ]]; then
chances=0
else
kill -9 $(jobs -l | awk '{print $2}')
chances=$(($chances-1))
if [[ $chances -gt 0 ]]; then
echo "one more chance for parameter $param"
fi
fi
done
param=$(($param+1))
done
<强> UPD 强> 这是OP要求的另一个答案。 这里仍然有两个脚本。但它们可以分成两个文件。
请注意$() &
用于在后台运行子shell
#!/bin/bash
# Script launcher
pscript='rand.py'
for param in {1..10}
do
# start background sub-shell, where python with $param is started
echo $(
left=3
error_on_exit=1
# go if any chances left and previous run exits not with code 0
while [[ ( ( $left -gt 0 ) && ( $error_on_exit -ne 0 ) ) ]]; do
left=$(($left-1))
echo "param=$param; chances left $left "
# run python and grab python exit code (=0 if ok)
python $pscript $param
error_on_exit=$?
done
) &
done
# Script controller
# just kills python processes older than 2 seconds
# exits after no python left
# $(...) & can be removed if this code goes to separate script
$(while [[ $(ps | grep -v 'grep' | grep -c python ) != "0" ]]
do
sleep 0.5
killall -9 -q --older-than 2s python
done) &