我感觉可能是时间读取出错了。
在脚本最前面加上一句: 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:/bin
15 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
主要问题还是这个头部多了空格!!!