shell重定向输出被截断

最近服务器总出问题,我就写了一段代码,保存每秒的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中断,才能继续执行。

求大神们帮帮忙,看看到底啥情况,好神奇啊。。。

阅读 9k
2 个回答

你那个截断是发生在多久?按照你的脚本,6小时之后文件会清除。

sleep 0.5
((i++))
if [ $i -eq 43200 ]
then
    ./remove_io_log.sh
    ((i=i%43200))
fi

兄弟,你的问题解决没,我在用oracle的oswbb监控数据库时,也发现这个问题,我把-c选项加入后,command列自动截取,只获取19个长度,我看你的“dd if=/dev/zero of=”也是19个长度。网上还没找到方法

我找到方法了,造成截取的原因是nohup,因为nohup没有将当前shell环境变量带过去。在脚本中设置shell环境变量COLUMNS=189或者其他值即可。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进