0

我正在尝试编写一个脚本,以允许我在 100% 的时间内使用“压力”应用程序而不会占用 CPU。我将内存分配和 CPU 分配分成两个单独的“压力”命令,这样我就可以持续给内存施加压力,同时只给 CPU 施加 1/2 的时间。例如,

#!/bin/bash
set -m

/usr/local/bin/stress --vm 1 --vm-bytes 100MB &
while [ thing that evaluates as true ]
do
  /usr/local/bin/stress --cpu 1 --timeout 5s
  /usr/bin/sleep 5s
done

echo "Running jobs at end of script are: `jobs -p`"
echo `jobs -p` | /usr/bin/xargs kill -9
echo "After trying to kill them, running jobs are now: `jobs -p`"

但是,出于某种原因,当我这样做时,我最终会看到每次尝试运行它时实际上都会调用压力两次。这意味着我最终得到了两个压力分配内存的实例,然后是两个占用 CPU 的压力实例,然后停止,然后将其占用,然后停止,等等。

此外,当 while 循环退出时,我的 kill 最终只杀死了在后台运行的两个压力实例之一。

从 ps -ef 命令中我可以看到,一个“压力”的父 pid 是另一个“压力”的 pid。因此,当 while 循环退出时,我编写的 kill 只会杀死其中一个内存分配压力实例,因为第二个不属于脚本。

脚本运行期间的进程:

linux:~ # ps -ef | egrep "stress|bash"
...
root     23776 20979  0 14:32 pts/0    00:00:00 /bin/bash ./base_case.sh
root     23785 23776  0 14:32 pts/0    00:00:00 stress --vm 1 --vm-bytes 100MB
root     23788 23785  0 14:32 pts/0    00:00:16 stress --vm 1 --vm-bytes 100MB
root     23802 23776  0 14:32 pts/0    00:00:00 stress --cpu 1 --timeout 5s
root     23803 23802  0 14:32 pts/0    00:00:01 stress --cpu 1 --timeout 5s
...

脚本的输出似乎暗示每次只调用一个“压力”:

linux:~ # ./base_case.sh 
stress: info: [23785] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: info: [23802] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
stress: info: [23802] successful run completed in 5s
Running jobs at end of script are: 23785
./base_case.sh: line 14: 23785 Killed /usr/local/bin/stress --vm 1 --vm-bytes 100MB
After trying to kill them, running jobs are now: 

脚本完成后的处理:

linux:~ # ps -ef | egrep "stress|bash"
...
root     23788     1  0 14:32 pts/0    00:00:58 stress --vm 1 --vm-bytes 100MB
...

我会避免任何关于将我的压力减半的笑话,但我真的很感激任何可以阻止我加倍使用从我的脚本调用的压力应用程序(并导致内存泄漏......)的提示。谢谢!

4

1 回答 1

1

它不是创建两个实例,它只是创建一个线程。您可以看到 CPU 压力调用的 PID 是 23802,这是ps输出中第二个条目的父 PID。

我建议使用htop树视图(F5),您可以轻松地看到层次结构。(也许top也有树视图)

于 2014-03-21T19:06:13.690 回答