监控流程的生命周期

时间:2015-07-31 02:10:08

标签: shell

我有一个名为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次。

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) &