最近服务器总出问题,我就写了一段代码,保存每秒的TOP快照到文件中,可以在出问题的时候,定位问题。代码如下:
#!/bin/bash
mkdir -p ./log
i=0
while true
do
date "+%y-%m-%d %H:%M:%S" >> ./log/Top.log.`date +%y-%m-%d`
echo " PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND" >> ./log/Top.log.`date +%y-%m-%d`
top -b -c -n 1 | sed -n '8,18p' | sed '/top -b -c -n 1/d' >> ./log/Top.log.`date +%y-%m-%d`
echo >> ./log/Top.log.`date +%y-%m-%d`
sleep 0.5
((i++))
if [ $i -eq 43200 ]
then
./remove_io_log.sh
((i=i%43200))
fi
done
然后,写了一个启动脚本,方便批量启动或关闭,代码如下:
#!/bin/bash
cd `dirname $0` || exit
start() {
setsid ./getTopInfo.sh &
}
stop() {
killall -9 getTopInfo.sh
}
case "$1" in
start)
stop
start
echo "Done!"
;;
stop)
stop
echo "Done!"
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
但是截出来的日志,会发现一行超过一定数量后,就会被截断.很是好奇,不知道为什么,还望大神们给个思路啊。
结果类似这样。我输入的命令是:
dd if=/dev/zero of=test bs=1M count=5000
但是屏幕上就剩一半了。
还有就是,启动脚本的start()函数,如果用如下方式:
start() {
setsid ./getTopInfo.sh > /dev/null &
}
就可以批量ssh执行命令并正确退出,例如:
for ip in `cat ip`; do ssh $ip "cd /home/xxx/dir/ && ./topLoad.sh start"
但是,如果改成:
start() {
setsid ./getTopInfo.sh &
}
脚本就会卡在第一台机器执行完,除非使用ctrl + c中断,才能继续执行。
求大神们帮帮忙,看看到底啥情况,好神奇啊。。。
你那个截断是发生在多久?按照你的脚本,6小时之后文件会清除。