0

我正在尝试执行以下操作:

获取 的输出free -mo,取第二行并每 30 秒将其记录到文件中。

当我跑

$free -mo -s 30 

它每 30 秒运行一次并显示输出。

但是当我跑步时

$ free -mo -s 30 | head -2 | tail -1

它只运行一次。我无法弄清楚出了什么问题。

free Manual 说 free -s 30 每 30 秒运行一次命令。

4

5 回答 5

6

head -2只返回前 2 行输出然后退出。tail -1返回最后一行,然后退出。当任何程序在管道中退出时,它会杀死整个管道,因此在完成free时停止。headtail

于 2012-12-31T15:06:08.910 回答
0

采用free -mo -s 30 &> test.txt &

这将获取free命令的所有输出并将其输出到 test.txt 并在后台运行它。

于 2012-12-31T15:08:34.350 回答
0

尝试

free -mos 30 | grep 'Mem:' >yourlog.txt

(但您可能会更好地考虑使用类似 sar 来捕获此类数据 - 它还可以报告许多其他内容 - 只需推迟过滤/提取,直到您从数据中生成报告)。

于 2012-12-31T15:18:02.520 回答
0

威尔·哈通是对的。而是这样做:

虽然是真的;做免费-mo | 头-2 | 尾巴-1;睡30;完毕

于 2012-12-31T15:28:32.280 回答
0

感谢您的回答。我试图监视进程的内存利用率。我想我明白了。

START_TIME=$(date);
cd /data;

INPUT_DATA=$1;
CODE_FILE=$2;
TIMES=$3;

echo "$START_TIME" > "$CODE_FILE.freeMemory_$TIMES.log";
free -mo -s 30 >> "$CODE_FILE.freeMemory_$TIMES.log" &
freepid=$!;

sleep 1m;
#echo "PID generated for free command -- $freepid";
START_TIME=$(date);
i=0;
while [ $i -le $TIMES ]
    do
            sh runCode.sh $CODE_FILE "output.csv" $INPUT_DATA;
            i=`expr $i + 1`
    done

END_TIME=$(date);
echo "process started at $START_TIME and ended at $END_TIME " ;
sleep 1m;
kill -9 $freepid;
END_TIME=$(date);
echo "$END_TIME" >> "$CODE_FILE.freeMemory_$TIMES.log";
于 2013-01-01T07:17:00.803 回答