问题描述:
1、脚本中需要用ifconfig获取机器的IP地址,但是此脚本放置于crontab中调用总是获取不到IP
2、单独运行此命令或者写一个简单的脚本单独测试却都是OK的
3、在运行的脚本的ifconfig命令前面加入全路径就可以解决这个问题。
总结:
这是用于crontab不加载用户的环境变量导致的。
解决方法:
脚本中所有的命令和工具使用绝对路径例如/usr/local/bin/mysql,或者在脚本前面执行一下profile文件:. /etc/profile即可
2.crontab执行结果不对
例如:
判断一个文件生成时间是每天18:00生成的
-rw-r--r-- 1 user user 30555594 2009-05-15 18:00 text.txt
if [ `ls -al test.txt |awk ’{print $7}’` == "18:00" ]
then
………………
fi
在客户端测试没有问题,可是放到crontab中,就判断不对了。
其实这还是用户环境的问题,
客户端登陆的时候会自动加载/etc/sysconfig/language(一般在/etc/profile文件中加载),
其中有的机器会设置客户端字符集:
RC_LANG="en_US.ISO-8859-1"
使用env|grep LANG的结果是
LANG=en_US.ISO-8859-1
这个时候ls等命令的结果是:
-rw-r--r-- 1 user user 30555594 2009-05-15 18:00 text.txt
时间在第七个字段。
当crontab自动执行的时候,字符集没有设置
使用env|grep LANG的结果是空
这个时候ls等命令的结果是:
-rw-r--r-- 1 mqq mqq 12785 May 15 18:00 text.txt
时间在第八个字段,判断第七个字段为时间的脚本就出错了。
解决方法:
这个时候在脚本前面加上export LANG=en_US.ISO-8859-1或者执行一下profile文件:. /etc/profile即可
3.crontab占用大量机器资源
日志服务器172.16.0.100偶尔出现crond占用了cpu非常高的情况
使用pstree查看是调用stat_day_log.sh这个脚本导致crond占用cpu过高
查看crontab的配置:
*/10 * * * * /usr/local/dev/Y_script/stat_day_log.sh 5
然而执行这个脚本,非常快就完成了,一点也不占用资源
而且理论上,及时脚本非常占用资源,调用它的crond也不会占用资源才对。
再次执行脚本发现,脚本有错误输出:
gzip: Y.YUiS_20090602.log.gz: No such file or directory
于是想到,会不会是由于crontab没有默认tty(默认输出)导致呢?
于是加上
*/10 * * * * /usr/local/dev/Y_script/stat_day_log.sh 5 2>&1 >> /usr/local/dev/Y_script/stat_day_log.log
果然问题解决了。为了确认到底是正常输出还是错误输出导致crontab僵死,进行了以下两个配置:
*/10 * * * * /usr/local/dev/Y_script/stat_day_log.sh 5 >> /usr/local/dev/Y_script/stat_day_log.log
还是有问题。
于是可以确认是由于crontab没有将默认错误输出重定向到指定文件导致。
这种问题也不是一定重现,只有负载很高的时候偶尔会出现(一出现就会造成机器僵死宕机)。
解决方法:
养成良好的习惯,crontab默认加上错误日志重定向,如果不需要错误日志信息,也需要加上:> /dev/null 2>&1
阅读(2744) | 评论(0) | 转发(0) |