S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Crontab与shell不得不说的故事

Posted on 2011-05-23 08:35 S.l.e!ep.¢% 阅读(464) 评论(0)  编辑 收藏 引用 所属分类: Unix

>>Crontab与shell不得不说的故事


最近做一个计划任务老出毛病,脚本手动执行一切正常,在crontab里面就不能正常执行,检查问题的时候始终不得方向,之后查看邮件才让我发现是crontab的环境变量设置问题。现在知道要怎么修改了,哈哈,拿出来与大家分享,这个小问题还是比较值得留意一下的。

Crontab执行时不会读取用户的环境变量,所以有时在crontab中添加了脚本任务后经常会发现执行失败,比如说执行ifconfig找不到这个命令之类的。大多数情况下是可能由于环境变量设置问题,如果有其他具体情况可以看root的mail里面邮件。因此,在编写脚本时要声明环境变量,防止发生此类错误。

在脚本开头第一行#!/bin/bash和脚本注释下添加两行内容,如下:

?
1
2
3
4
5
#!/bin/bash
#这里放注释
PATH= /bin : /sbin : /usr/bin : /usr/sbin : /usr/local/bin : /usr/local/sbin
export PATH
#下面就是脚本的主要内容,可以声明变量可以写函数之类的

注意要在所有其他非注释内容之前,这样做之后脚本在crontab中就能正常执行了。

网上还有说法说用source ~/.bash_profile,我尝试之后没成功,不知道是我添加的地方错了还是咋的。

另外在给crontab添加任务时不要忘了尽量让信息返回,才能更早发现问题更快解决问题。

crontab的前面5个字段的意思分别是:

分钟 (0-59)

小时 (0-23)

日期 (1-31)

月份 (1-12)

星期 (0-6)//0代表星期天

除了数字还有几个个特殊的符号就是”*”、”/”和”-”、”,”,*代表所有的取值范围内的数字,”/”代表每的意思,”*/5″表示每5个单位,”-”代表从某个数字到某个数字,”,”分开几个离散的数字,比如下面几个例子:

在12:00和13:00分别执行一次某命令,格式如下:

?
1
00 12,13 * * * command

每两个小时执行一次命令

?
1
0 * /2 * * * command

晚上11点到早上8点之间每两个小时,早上八点

?
1
0 23-7 /2 ,8 * * * command

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

?
1
0 11 4 * 1-3 command

1月1日早上4点

?
1
0 4 1 1 * command

命令之后可以将命令的信息重定向。Linux中重定向规则如下(不仅仅可用于crontab):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
command > filename 把标准输出重定向到一个新文件中
command >> filename 把标准输出重定向到一个文件中(追加)
command 1 > fielname 把标准输出重定向到一个文件中
command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把标准错误重定向到一个文件中
command 2 >> filename 把标准输出重定向到一个文件中(追加)
command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
command < filename >filename2 把 command 命令以filename文件作为标准输入,以filename2文件作为标准输出
command < filename 把 command 命令以filename文件作为标准输入
command << delimiter 把从标准输入中读入,直至遇到delimiter分界符
command <&m 把文件描述符m作为标准输入
command >&m 把标准输出重定向到文件描述符m中
command <&- 把关闭标准输入
command 2>&1 把 command 命令标准错误重定向到标准输出

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理