Linux下shell脚本手动执行和放在crontab中自动执行的结果不一样

来源:互联网 发布:融合网络 英文 编辑:程序博客网 时间:2024/04/24 15:44

我感觉可能是时间读取出错了。 


在脚本最前面加上一句:     source ~/.bash_profile       

http://blog.chinaunix.net/uid-20648405-id-1907334.html


先试一下再run一次看看 。  



http://ivan4126.blog.163.com/blog/static/20949109220129301026060/ 


问题位置: 
 14 for i in {0..29}
 15 do
 16   num=`printf "%05d\n" $i`
 17   cat shorturl_score/part-$num >> tmp
 18   echo $num
 19 done

在crontab中执行的时候,这个循环居然只执行了一次, 太奇怪了。 

通过1 * * * * (cd ~/a/b/; ./test.sh > t2 2>&1) 后得到错误日志:
  1 printf: 11: {0..29}: expected numeric value
  2 00000
  3 Finished merge 
看样子格式化printf的时候在crontab中行不通,到底为什么呢?   还不知道!!!
 [: 20: Illegal number: {0..29}    

========================
脚本中的环境变量 env > env.log 打出为: 
1 HOME=/home/kk 
2 OLDPWD=/home/kk 
3 LOGNAME=kk 
4 PATH=/usr/bin:/bin 
5 SHELL=/bin/sh 
6 PWD=/home/kk/weibo/a 
明显是很多不同的, 而且PATH少了很多设置。 

因此想办法在shell脚本的开头加上这些东西: 
  1 #!/bin/bash
  2 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
                                                               
  3 SHELL=/bin/bash
  4 JAVA_HOME=/usr/lib/jvm/java-6-sun
  5 _=/usr/bin/env
  6 
  7 
  8 env > env.log
  9 . /etc/profile
 10 . ~/.profile
shit! 结果还是失败!!! 



解决办法: ==========================================》
方法一: 
       在/etc/crontab 文件中直接添加我的crontab job任务即可。  但是此法需要root权限才能修改此文件, 在我的本机是可以的;但是我在服务器上面就是不可以了,没有root权限。
方法二: 
        在crontab -e 中的头部加上PATH, 该PATH和命令行下env得到的PATH一样。 
me@server:~/$ crontab -l
# m h  dom mon dow   command
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 


这样的话,上面说的shell脚本头部那一堆垃圾可以都去掉,反正加上去也没有正确的结果。 



参考:

You can also set the PATH variable in the crontab file, which will apply to all cron jobs. E.g.

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin15 1 * * * backupscript --incremental /home /root
http://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work 



test.sh这个脚本的crontab任务过了,然后回到项目中的shell脚本中设置还是过不了,检测后对比发觉原来是
头部的这个#后面不能有空格,OMG。。。
#!/bin/bash   




总结
我目前的这个场景下需要注意的两点:
1.crontab -e 编辑个人的crontab job, 在头部加上PATH:
    # m h  dom mon dow   command
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 
2.运行的shell脚本头部的bash注释不能有空格
    # !/bin/bash
    #!/bin/bash

主要问题还是这个头部多了空格!!!