我正在尝试做以下事情:
获取free -mo
的输出,取第二行并每隔30秒将其记录到一个文件中。
当我跑步时
$free -mo -s 30
它每30秒运行并显示一次输出。
但是当我跑步时
$ free -mo -s 30 | head -2 | tail -1
它只运行一次。我无法弄清楚出了什么问题。
免费手册说free -s 30每隔30秒运行一次命令。
答案 0 :(得分:6)
head -2
仅返回前2行输出然后退出。 tail -1
返回最后一行,然后退出。当任何程序在管道中退出时,它会终止整个管道,因此free
和head
完成时会tail
停止。
答案 1 :(得分:0)
使用free -mo -s 30 &> test.txt &
这将获取free
命令的所有输出并将其输出到test.txt并在后台运行。
答案 2 :(得分:0)
尝试
free -mos 30 | grep 'Mem:' >yourlog.txt
(但你可能会更好地考虑类似sar之类的东西来捕获这类数据 - 它还可以报告很多其他事情 - 只需推迟过滤/提取,直到你从数据中生成一个resport)。
答案 3 :(得分:0)
Will Hartung是对的。而是这样做:
虽然如此;做自由-mo |头-2 |尾巴-1;睡30;完成
答案 4 :(得分: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";