Bash:流程监控和操作

时间:2014-10-13 18:50:34

标签: linux bash

我有一个处理某些输入文件的C程序。我使用Bash脚本将输入文件一个接一个地提供给该程序,以及其他一些参数。每个输入文件由程序处理4次,每次通过改变一些参数。您可以将其视为使用不同参数测试C程序的实验。

这个C程序可以非常快速地消耗内存(甚至可以占用超过95%的OS内存,从而导致系统速度变慢)。因此,在我的脚本中,我监视程序的每次测试运行的两件事 - 总运行时间和消耗的内存百分比(从top命令获得)。当其中任何一个 第一个 超过阈值时,我会使用killall -q 0 processname终止C程序,然后开始下一次测试运行。

这就是我的脚本的结构:

 # run in background
./program file_input1 file_input2 param1 param2 &

 # now monitor the process
 # monitor time     
 sleep 1
 ((seconds++))
 if [ $seconds -ge $timeout ]; then
     timedout=1
     break
 fi

 # monitor memory percentage used
 memused=`top -bn1 | grep \`pidof genpbddh2\` | awk '{print $10}' | cut -d'.' -f1`

 if [ $memused -ge $memorylimit ]; then
    overmemory=1
    break
 fi

这整个过程在一个循环中运行,它不断为C程序的参数生成新值 当程序由于超时或超出内存限制使用而中断循环时,执行此命令:
killall -q 0 program

问题:
我的意图是,一旦程序在后台启动(上面的第1行),我就可以监控它。然后转到下一个程序运行。测试用例的顺序执行 但是,似乎程序的所有未来运行由于某种原因由OS(Linux)安排。也就是说,如果测试运行1正在运行,则测试运行2,3,4 ......等等也以某种方式安排(没有运行1已完成)。至少,似乎从下面的观察方式:
当我按下Ctrl-C结束脚本时,它会干净地退出。但是,"程序的新实例"继续不断创造。脚本已经结束,但程序的实例仍在继续启动。我检查并确保脚本已经结束。现在,我编写了一个脚本来无限地检查正在创建的程序的实例并将其删除。最终,该程序的所有预先安排的实例都被杀死,并且不再创建新的实例。但这真是太痛苦了。

  1. 这是外部监控程序的正确方法吗?
  2. 关于为什么会出现这个问题以及如何解决这个问题的任何线索?

1 个答案:

答案 0 :(得分:0)

我想说监控像这样的程序更正确的方法是:

ulimit -v $ memorylimit

如果设置了这样的限制,任何进程如果使用过多的虚拟内存都会被杀死。也可以设置其他限制,例如使用的最大cpu时间或最大打开文件数。

要查看您当前的限制,您可以使用

ulimit -a

Ulimit适用于bash用户,如果使用tcsh,则使用的命令是限制。