某个脚本手工运行可以产生正确输出,而放在定时任务crontab中却有问题。
解决思路:
1、一般的crontab都会生产mail邮件(如果没有在crotab里面删掉末尾的">>/dev/null"),使用mail命令看看crontab产生的消息,定位一下具体出了什么问题,我看到的报错就是:
Message 49: From root@lvs2.localdomain Tue Sep 23 19:56:02 2014 Return-Path: <root@lvs2.localdomain> X-Original-To: root Delivered-To: root@lvs2.localdomain From: root@lvs2.localdomain (Cron Daemon) To: root@lvs2.localdomain Subject: Cron <root@lvs2> /bin/bash /root/collect_log.sh Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/root> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=root> X-Cron-Env: <USER=root> Date: Tue, 23 Sep 2014 19:56:02 -0700 (PDT) Status: RO /root/collect_log.sh: line 20: ifconfig: command not found /root/collect_log.sh: line 20: ifconfig: command not found /root/collect_log.sh: line 20: ifconfig: command not found /root/collect_log.sh: line 20: ifconfig: command not found /root/collect_log.sh: line 20: ifconfig: command not found
2、由此很清晰看到是ifconfig没有正确执行,很明显系统不可能没有这个命令,应该是没找到正确路径的问题,这是因为crontab执行时调用的是/etc/crontab文件中的配置,查看一下:
[root@lvs2 ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed * * * * * ls * * * * * ls -e -
。。。好吧,PATH是对的,貌似这个配置有点坑爹,但是不管怎样,对照了当前home目录下.bashrc的内容,发现是直接调用的/etc/下的profile和bashrc,先在脚本中加上:
source /etc/profile source /etc/bashrc
如果还有其他特定配置文件也都加载下。这下计划任务执行就OK了。
3、其他的一些错误大多是crontab编写格式错误,或者是脚本权限不对,好好检查下就没啥事了,为了平台的通用性,最好还是多写绝对路径,少用相对路径。最后记得在crontab的任务末尾加上>>/dev/null 2>1&,避免太多输出占满空间。
本文出自 “hiubuntu” 博客,请务必保留此出处http://qujunorz.blog.51cto.com/6378776/1557641
原文地址:http://qujunorz.blog.51cto.com/6378776/1557641