Linux Bash:进程监视和操作
我有一个C程序,可以处理一些输入文件。我正在使用Bash脚本将输入文件一个接一个地提供给这个程序,以及一些其他参数。每个输入文件由程序处理4次,每次通过改变一些参数。你可以把它看作是一个用不同参数测试C程序的实验 这个C程序可以非常快地消耗内存(甚至可以占用操作系统内存的95%以上,导致系统速度变慢)。因此,在我的脚本中,我正在为程序的每个测试运行监视两件事——总运行时间和消耗的内存百分比(从Linux Bash:进程监视和操作,linux,bash,Linux,Bash,我有一个C程序,可以处理一些输入文件。我正在使用Bash脚本将输入文件一个接一个地提供给这个程序,以及一些其他参数。每个输入文件由程序处理4次,每次通过改变一些参数。你可以把它看作是一个用不同参数测试C程序的实验 这个C程序可以非常快地消耗内存(甚至可以占用操作系统内存的95%以上,导致系统速度变慢)。因此,在我的脚本中,我正在为程序的每个测试运行监视两件事——总运行时间和消耗的内存百分比(从top命令获得)。当它们中的任何一个第一次超过阈值时,我使用killall-q0processname终
top
命令获得)。当它们中的任何一个第一次超过阈值时,我使用killall-q0processname
终止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程序
问题:我的意图是,一旦程序在后台启动(上面第1行),我就可以监视它。然后转到程序的下一次运行。测试用例的顺序执行。
但是,出于某种原因,该程序的所有未来运行似乎都是由操作系统(Linux)安排的。也就是说,如果测试运行1正在运行,那么测试运行2、3、4..等等也会以某种方式安排(运行1尚未完成)。至少,从下面的观察来看是这样的:
当我按下Ctrl-C结束脚本时,它干净地退出了。但是,“计划”的新实例正在不断创建。脚本已结束,但程序实例仍在持续启动。我检查并确保脚本已经结束。现在,我编写了一个脚本来无限地检查正在创建的这个程序的实例并杀死它。最终,所有预先安排好的程序实例都被终止,不再创建新的实例。但这都是很大的痛苦
我想说一种更正确的监控程序的方法是: ulimit-v$memorylimit 设置了这样的限制后,如果进程使用了太多的虚拟内存,那么它将被杀死。还可以设置其他限制,如使用的最大cpu时间或打开文件的最大数量 要查看您当前的限制,您可以使用 ulimit-a
Ulimit是针对bash用户的,如果您使用tcsh,那么要使用的命令是limit。您能为这个问题提供一个完整的、独立的复制器吗?顺便说一句,这可能是那些发现自己在这个问题上的人感兴趣的。