4

我正在尝试为在我的机器上运行的 matlab 作业创建一个轻量级的内存分析器。有一个或零个 matlab 作业实例,但它的进程 ID 经常更改(因为它实际上是由另一个脚本调用的)。

所以这是我用来记录内存使用情况的 bash 脚本:

#!/bin/bash
pid=`ps aux | grep '[M]ATLAB' | awk '{print $2}'`
if [[ -n $pid ]]
then
    \grep VmSize /proc/$pid/status
else
    echo "no pid"
fi

当我像这样在 bash 中运行这个脚本时:

./script.sh

它工作正常,给我以下结果:

VmSize:  1289004 kB

这正是我想要的。

现在,我想定期运行它。所以我用 运行它watch,如下所示:

watch ./script.sh

但在这种情况下,我只收到:

no pid

请注意,我知道 matlab 作业仍在运行,因为我可以在相同的 pid 上看到它top,此外,我知道每个 matlab 作业需要几个小时才能完成。

我很确定设置 pid 时的引号有问题。我只是不知道如何解决它。有人知道我在做什么错吗?

PS。在 的手册页中watch,它说命令由sh -c. 我确实运行了我的脚本sh -c ./script,它工作得很好,但watch没有。

4

4 回答 4

3

为什么不使用带有 sleep 命令的循环呢?

例如:

 #!/bin/bash
pid=`ps aux | grep '[M]ATLAB' | awk '{print $2}'`

while [ "1" ]
do
if [[ -n $pid ]]
then
    \grep VmSize /proc/$pid/status
else
    echo "no pid"
fi
sleep 10
done

这里脚本休眠(等待)10 秒。您可以设置更改睡眠命令所需的时间间隔。例如让脚本休眠一个小时使用sleep 1h.

要退出脚本,请按 Ctrl - C

于 2013-10-23T04:00:08.347 回答
1

pid=`ps aux | grep '[M]ATLAB' | awk '{print $2}'`

可以改为:

pid=$(pidof MATLAB)
于 2013-10-23T05:35:11.443 回答
1

我不知道为什么它不能在手表中工作,但是您可以使用 cron 作业并将脚本记录到如下文件中:

#!/bin/bash
pid=$(pidof MATLAB) # Just to follow previously given advice :)
if [[ -n $pid ]]
then
    echo "$(date): $(\grep VmSize /proc/$pid/status)" >> logfile
else
    echo "$(date): no pid" >> logfile
fi

您当然必须通过触摸创建日志文件。

于 2013-10-23T07:37:00.380 回答
0

您可以尝试在手表中运行 ps 命令。我过去曾遇到过手表切割线等问题,因为它们太长了。

可以通过使终端更宽地运行命令或像这样更改列来修复它(可能需要根据自己的喜好调整 160):export COLUMNS=160;

于 2013-10-24T21:14:15.693 回答