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中断,才能继续执行。
求大神们帮帮忙,看看到底啥情况,好神奇啊。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你那个截断是发生在多久?按照你的脚本,6小时之后文件会清除。
兄弟,你的问题解决没,我在用oracle的oswbb监控数据库时,也发现这个问题,我把-c选项加入后,command列自动截取,只获取19个长度,我看你的“dd if=/dev/zero of=”也是19个长度。网上还没找到方法
我找到方法了,造成截取的原因是nohup,因为nohup没有将当前shell环境变量带过去。在脚本中设置shell环境变量COLUMNS=189或者其他值即可。