Chinaunix

标题: crontab与环境变量,以及应该注意的一些问题 [打印本页]

作者: xiaopan3322    时间: 2011-03-27 20:41
标题: crontab与环境变量,以及应该注意的一些问题
本帖最后由 xiaopan3322 于 2011-07-06 16:15 编辑

点此查看“如何在cygwin里启用和配置crontab”: http://scmbob.org/configure_crontab_in_cygwin.html

--------------------------------------------------------------

首先,在开篇之前,先附上一份cron图片,此图片是我从Jenkins的Poll SCM插件的帮助中截取的,有兴趣的可以去了解下……


今天在网上看到一篇文章,关于crontab的,其中有两点提到了crontab和环境变量,以及需要注意的一些事项,基础,但是个人觉得说的特别的好,很多时候容易犯错的往往就是这些基础,这里转载一下。。。好记性不如烂笔头。。。
原文请参看:
http://yunhaozou.org/linux/109.html

2. crontab与环境变量
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

3. 其他应该注意的问题
1)新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
2)每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。
3)当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
4)千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
5)在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’`。

作者: expert1    时间: 2011-03-27 21:39
回复 1# xiaopan3322


    顶,加了个精华,建议问此类问题的多看这个,避免月经贴呵呵。
作者: xiaopan3322    时间: 2011-03-27 21:41
回复  xiaopan3322


    顶,加了个精华,建议问此类问题的多看这个,避免月经贴呵呵。
expert1 发表于 2011-03-27 21:39



    版主英明神武,,,
作者: xrzs1986    时间: 2011-03-29 00:34

作者: Shell_HAT    时间: 2011-03-29 00:44
工作中遇到比较多的是root密码过期,导致它的cronjob无法正常执行。
作者: 南极雨    时间: 2011-03-29 09:59
总结的很有意义...
作者: gufengdianying    时间: 2011-03-29 16:37
我说怎么那么熟悉,原来是我以前写的。呵呵~~
作者: xiaopan3322    时间: 2011-03-29 17:07
我说怎么那么熟悉,原来是我以前写的。呵呵~~
gufengdianying 发表于 2011-03-29 16:37



    我严格按照规定,注明转载的哦。。。
作者: compare2000    时间: 2011-03-29 18:14
好贴
作者: davidbeckham921    时间: 2011-03-31 14:23
好!顶!~~

1)新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。

很容易等不到结果。
作者: shplpy    时间: 2011-05-08 01:11
:wink:
作者: hay_sol    时间: 2011-05-08 02:13
总结的很好
作者: xiaopan3322    时间: 2011-07-06 16:14
更新文章:
如何在cygwin里启用和配置crontab”: http://scmbob.org/configure_crontab_in_cygwin.html
作者: sunngyi    时间: 2011-07-08 10:19
顶起
作者: ywlscpl    时间: 2011-07-08 13:55
本帖最后由 ywlscpl 于 2011-07-08 13:58 编辑

近日遇到一crontab问题

一crontab脚本:
var=`db2 "select  ....."`
echo $var

var取到的值总是空的,var=$(db2 "select  .....")也一样

但输出到文件后再cat就可以:
db2 "select  ...." >tempfile$$
var=`cat tempfile$$`
rm -f tempfile$$
作者: xiaopan3322    时间: 2011-07-10 11:44
本帖最后由 xiaopan3322 于 2011-07-10 11:46 编辑
近日遇到一crontab问题

一crontab脚本:
var=`db2 "select  ....."`
echo $var

var取到的值总是空的 ...
ywlscpl 发表于 2011-07-08 13:55



   数据库命令不懂,
   不过这里db2的输出是什么啊?如果输出是个返回值或者是单个词的话,我觉得应该是不会有问题的……
   但是如果db2的输出是一段内容,而这段内容又会有空格存在的话,那在赋值的时候应该需要加个双引号吧……

   回头我换个命令去试试,没环境,呵呵
作者: xiaopan3322    时间: 2011-07-10 15:55
回复 15# ywlscpl


    白云兄,好像我这里测试没问题啊……
作者: maochanglu    时间: 2011-07-10 16:48
我能想到 就是在里面,
全部用绝对路径。有的时候会找不到命令
作者: ywlscpl    时间: 2011-07-10 21:54
本帖最后由 ywlscpl 于 2011-07-10 21:57 编辑

回复 16# xiaopan3322

select命令的输出经过滤后就是一日期:20110707

直接var=`db2 "select ..." |grep ...`,var取不到值
输出到文件再cat出来就能取到值
db2 "select ..." |grep ...  >tempfile
var=`cat tempfile`

挺奇怪一问题
作者: xiaopan3322    时间: 2011-07-10 23:00
回复 19# ywlscpl


    有几条comments:
    1,能不能一步一步的调试,好比,直接赋值var=20110707,然后。。。
    2,会不会是环境变量的问题?如第3)小点
    3,有没有涉及到转义?有时候转义也会引起问题
    4,cron进程应该没问题吧?
作者: ywlscpl    时间: 2011-07-11 12:45
已确认跟crontab无关
直接在命令行下已重现此现象
作者: ly5066113    时间: 2011-07-11 13:22
回复 19# ywlscpl


一点也不奇怪
var=`db2 "select ..." |grep ...`
`` 会起子shell , | 也会起子shell
在子shell的子shell中数据库连接是不存在的
可以试试
var=`{ db2 connect to xxx; db2 "select ..."; } |grep ...`

如果是AIX的ksh
可以直接read
db2 "select ..." | grep ... | read var
作者: ywlscpl    时间: 2011-07-11 14:11
本帖最后由 ywlscpl 于 2011-07-11 14:12 编辑

回复 22# ly5066113

确实是此原因:在子shell中必须重新连接数据库
原先考虑过子shell问题,但只考虑到环境变量,没考虑到父shell的数据库连接在子shell中无效

问题解决!
作者: ly5066113    时间: 2011-07-11 14:17
回复 23# ywlscpl


儿子还有效,但孙子就不行了。

作者: ywlscpl    时间: 2011-07-11 14:27
回复 24# ly5066113


刚才没有仔细测试,确实是子shell数据库连接还有效,但到孙shell就失效了。
  1. [edms@DzdaWeb ~]$ db2 connect to edmssub user edms using xxxx

  2.    Database Connection Information

  3. Database server        = DB2/LINUXX8664 8.2.9
  4. SQL authorization ID   = EDMS
  5. Local database alias   = EDMSSUB

  6. [edms@DzdaWeb ~]$ db2 "select value_char from T_SYS_PARAMETER where name_en='work_date'"

  7. VALUE_CHAR                                                                                                                                            
  8. ------------------------------------------------------------------------------------------------------------------------------------------------------
  9. 20110710                                                                                                                                             

  10.   1 record(s) selected.

  11. [edms@DzdaWeb ~]$ w=`db2 "select value_char from T_SYS_PARAMETER where name_en='work_date'"`
  12. [edms@DzdaWeb ~]$ echo "$w"                                                                                            

  13. VALUE_CHAR                                                                                                                                            
  14. ------------------------------------------------------------------------------------------------------------------------------------------------------
  15. 20110710                                                                                                                                             

  16.   1 record(s) selected.
  17. [edms@DzdaWeb ~]$ w=`db2 "select value_char from T_SYS_PARAMETER where name_en='work_date'"|awk '1'`
  18. [edms@DzdaWeb ~]$ echo "$w"
  19. SQL1024N  A database connection does not exist.  SQLSTATE=08003
复制代码

作者: xiaopan3322    时间: 2011-07-11 14:36
强,学习
作者: xiaopan3322    时间: 2011-07-11 14:43
回复 25# ywlscpl


    学习学习……
作者: ywlscpl    时间: 2011-07-11 15:03
忘了说了
sco系统ksh环境没这问题
  1. p51:业务机2:[/u/vost]$db2 "select * from gggj" |awk '/0/'   
  2.   0 record(s) selected.
  3. p51:业务机2:[/u/vost]$w=`db2 "select * from gggj" |awk '/0/'`
  4. p51:业务机2:[/u/vost]$echo "$w"
  5.   0 record(s) selected.
复制代码

作者: blackold    时间: 2011-07-11 15:18
回复 22# ly5066113


    向 Tim 老师学习。
作者: ly5066113    时间: 2011-07-11 16:34
回复 29# blackold


黑哥言重了,对db2略懂而已。
作者: ulovko    时间: 2012-05-22 09:51
很需要注意的地方
作者: lanni654321    时间: 2015-05-16 12:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: 少林功夫好    时间: 2015-10-28 13:51
大伙都聊到了子孙shell啦?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2