我只是shell脚本的初学者,并编写了一个运行top命令并清除输出的小脚本,只留下cpu ram和swap值。如果我手动运行脚本一切正常,但是当我安排脚本从/ etc / crontab每隔5分钟运行时,所有运行正常,但top命令的输出不会出现在日志中。
#############################
Sat Dec 12 02:05:00 GMT 2015
#############################
以下是脚本。有人可以帮助我让它发挥作用吗?
#!/bin/sh
echo "#############################" >> /var/tmp/TOPUSAGE.log
echo "" >> /var/tmp/TOPUSAGE.log
/bin/date >> /var/tmp/TOPUSAGE.log
/usr/bin/top -b -n 1 | /usr/bin/grep -E "Cpu|Mem|Swap|gis" >> /var/tmp/TOPUSAGE.log
echo "" >> /var/tmp/TOPUSAGE.log
echo "#############################" >> /var/tmp/TOPUSAGE.log
答案 0 :(得分:0)
在comment中,我说:
您应该使用exec>>在第一个回声之前的/var/tmp/TOPUSAGE.log,或者你应该在第一个回声之前使用{在一条线上并且}>> /var/tmp/TOPUSAGE.log在最后一个echo之后自己在一行上,在任何一种情况下都会丢失所有的中间>>重定向。
我不明白你的回复。是否可以帮助纠正我粘贴的脚本。
原始脚本中的I / O重定向没有错。它只是冗长,重复,部分模糊了脚本的作用。
至少有三种备用重定向选项。
#!/bin/sh
exec >> /var/tmp/TOPUSAGE.log
echo "#############################"
echo ""
/bin/date
/usr/bin/top -b -n 1 | /usr/bin/grep -E "Cpu|Mem|Swap|gis"
echo ""
echo "#############################"
#!/bin/sh
{
echo "#############################"
echo ""
/bin/date
/usr/bin/top -b -n 1 | /usr/bin/grep -E "Cpu|Mem|Swap|gis"
echo ""
echo "#############################"
} >> /var/tmp/TOPUSAGE.log
选项1和2都避免重复。选项1更改了exec
之后的整个脚本的标准输出状态(直到反击exec
为止)。选项2将I / O重定向限制为大括号的范围 - 在本示例中,这是整个脚本,但这些可以在较大的脚本的一部分中起到良好的作用。请注意,大括号必须出现在命令可能出现的位置(大致在行的开头或分号后 - 或管道或和号)。
如果保留重复,最好为文件名创建一个变量,这样就不会重复多次:
#!/bin/sh
log="/var/tmp/TOPUSAGE.log"
echo "#############################" >> "$log"
echo "" >> "$log"
/bin/date >> "$log"
/usr/bin/top -b -n 1 | /usr/bin/grep -E "Cpu|Mem|Swap|gis" >> "$log"
echo "" >> "$log"
echo "#############################" >> "$log"