gpt4 book ai didi

linux - Bash:进程监控和操作

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:06 25 4
gpt4 key购买 nike

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

这个C程序可以非常快地消耗内存(甚至可以占用超过95%的操作系统内存,导致系统变慢)。因此,在我的脚本中,我为程序的每次测试运行监控两件事 - 总运行时间和消耗的内存百分比(从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 程序

问题:
我的意图是,一旦程序在后台启动(上面第一行),我就可以监视它。然后进入程序的下一次运行。测试用例的顺序执行。
但是,出于某种原因,似乎该程序的所有 future 运行都已由操作系统(Linux)安排了。也就是说,如果测试运行 1 正在运行,则也会以某种方式安排测试运行 2、3、4.. 等(运行 1 尚未完成)。至少,从以下观察来看似乎是这样:
当我按 Ctrl-C 结束脚本时,它干净地退出了。但是,“程序”的新实例仍在不断创建。脚本已经结束,但程序的实例仍在不断启动。我检查并确保脚本已经结束。现在,我编写了一个脚本来无限地检查正在创建的该程序的实例并杀死它。最终,该程序的所有预先安排的实例都被杀死,并且不再创建新的实例。但这是非常痛苦的。

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

最佳答案

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

ulimit -v $内存限制

设置这样的限制后,如果任何进程使用过多的虚拟内存,它将被终止。还可以设置其他限制,例如使用的最大 CPU 时间或打开文件的最大数量。

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

ulimit -a

ulimit 适用于 bash 用户,如果您使用 tcsh,则使用的命令是 limit。

关于linux - Bash:进程监控和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26346897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com