我有一个处理某些输入文件的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结束脚本时,它会干净地退出。但是,"程序的新实例"继续不断创造。脚本已经结束,但程序的实例仍在继续启动。我检查并确保脚本已经结束。现在,我编写了一个脚本来无限地检查正在创建的程序的实例并将其删除。最终,该程序的所有预先安排的实例都被杀死,并且不再创建新的实例。但这真是太痛苦了。
答案 0 :(得分:0)
我想说监控像这样的程序更正确的方法是:
ulimit -v $ memorylimit
如果设置了这样的限制,任何进程如果使用过多的虚拟内存都会被杀死。也可以设置其他限制,例如使用的最大cpu时间或最大打开文件数。
要查看您当前的限制,您可以使用
ulimit -a
Ulimit适用于bash用户,如果使用tcsh,则使用的命令是限制。