如何用脚本建立crontab shell脚本任务

定时任务顾名思义就是在某一时间点自动进行任务操作。在做Pgsql的备份利用crontab进行定时操作, 使用起来比较方便。故分享具体的定时编辑命令:crontab -e 首先从crontab的文件分析使用策略,root用户下,在/etc下有一个文件crontab,其内容如下[ ~]# cat /etc/crontab SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/# 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该
文件下的前四行内容为crontab的环境变量,SHELL变量的值指定系统使用的SHELL环境(该样例为bash
shell),PATH变量定义了执行命令的路径。Cron的输出以电子邮件的形式发给MAILTO变量定义的用户名。如果MAILTO变量定义为空字符
串(MAILTO=""),电子邮件不会被发送。执行命令或脚本时HOME变量可用来设置基目录。注:以上系统会默认可以不用修改任何!在root用户下,可以直接vim /etc/crontab文件进行脚本的添加定时任务脚本,而在其他普通用户下可以通过crontab &e 进行脚本的添加 编辑完成,可以用crontab &l进行查看脚本信息 定时命令脚本解析:从表格中可以看出脚本格式如下:minute hour day month week
user-name commandminute---分钟 (0-59)  hour------小时(0-23)  day--------日期(1-31)  month---月份(1-12)  week----星期(0-6) //0代表星期天  除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"*/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。以下举几个例子说明问题:以具体例子进行分析定时脚本:pgslq.sh为需要执行的脚本,内容为需要进行的备份操作或者其他任务脚本1 * * * * /home/postgres/pgsql.sh表示的是每小时的第一分钟执行该脚本2 3 * * * /home/postgres/pgsql.sh表示每天的3点零2分执行该脚本1 1 * * 0 / home/postgres/pgsql.sh表示的是每周的1点1分进行脚本的执行1 1 1 * * / home/postgres/pgsql.sh表示的是每月的1点1分进行脚本的执行比较容易犯的错误是通常会把每小时的第一分钟按做每分钟执行一次,这点要注意两者的区别:1 * * * * /home/postgres/pgsql.sh表示的是每小时的第一分钟执行该脚本*/1 * * * * /home/postgres/pgsql.sh表示的是每一分钟执行该脚本因此这里要记住&/&这个符号带来的区别&-&的用法:0 10 * * 1-3 / home/postgres/pgsql.sh表示的是每个周一到周三的早上10点执行该脚本0 10 * * 1、3、5 / home/postgres/pgsql.sh表示的是每周的周一、周三、周五的早上10点执行该脚本这些大致就是定时任务的几乎常见的可能性定时脚本。在表格中看到user-name这个表示的用户该脚本所在的用户,一般情况下在做项目不可能会有root用户进行编写,所以我们可能直接在普通用户下进行定时脚本的编写,直接执行crontab &e,编写定时任务。每
次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件
中,这个文件是不可以直接编辑的,只可以用crontab -e
来编辑。cron启动后每过一分钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。
阅读(...) 评论()教你在Linux中使用crontab命令定时执行shell脚本
用圣才电子书APP或微信扫一扫,在手机上阅读本文,也可分享给你的朋友。
  使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令。例如系统管理员安排一个备份任务使其每天都运行
  如何往 cron 中添加一个作业?
  # crontab &e
  0 5 * * * /root/bin/backup.sh
  这将会在每天早上5点运行 /root/bin/backup.sh
  Cron 各项的描述
  以下是 crontab 文件的格式:
  {minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
  o minute:区间为 0 & 59
  o hour:区间为0 & 23
  o day-of-month:区间为0 & 31
  o month:区间为1 & 12. 1 是1月. 12是12月.
  o Day-of-week:区间为0 & 7.周日可以是0或7.
  Crontab 示例
  1.在 12:01 a.m 运行,即每天凌晨过一分钟。这是一个恰当的进行备份的时间,因为此时系统负载不大。
  1 0 * * * /root/bin/backup.sh
  2.每个工作日(Mon & Fri) 11:59 p.m 都进行备份作业。
  59 11 * * 1,2,3,4,5 /root/bin/backup.sh
  下面例子与上面的例子效果一样:
  59 11 * * 1-5 /root/bin/backup.sh
  3.每5分钟运行一次命令
  */5 * * * * /root/bin/check-status.sh
  4.每个月的第一天 1:10 p.m 运行
  10 13 1 * * /root/bin/full-backup.sh
  5.每个工作日 11 p.m 运行。
  0 23 * * 1-5 /root/bin/incremental-backup.sh
  Crontab 选项
  以下是 crontab 的有效选项:
  o crontab &e :修改 crontab 文件.如果文件不存在会自动创建。
  o crontab &l :显示 crontab 文件。
  o crontab -r :删除 crontab 文件。
  o crontab -ir :删除 crontab 文件前提醒用户。
  以上就是crontab命令的具体使用方法了。
  作者:不详 来源:网络
小编工资已与此赏挂钩!一赏一分钱!求打赏↓ ↓ ↓
如果你喜欢本文章,请赐赏:
已赐赏的人
我的电子书crontab 计划任务不运行是咋回事?
要评论问题请先或
- Do all in command line
赞同来自: 、、、
要参与问题请先或
- 美妞猎手
要参与问题请先或
要参与问题请先或
- Shell 版主
要参与问题请先或
要参与问题请先或
要参与问题请先或
- Where amazing happens!
要参与问题请先或
要参与问题请先或
- Now is better than never.
要参与问题请先或
浏览: 4377
关注: 10 人温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
对于上面代码,当shell脚本手工执行的时候,结果没有任何问题,sqlldr_dir的值此时为脚本所在的路径:/home/coner/blackall/,故cd $sqlldr_dir/$sqlldr_data_dir可以成功登录到/home/coner/blackall/data下,再进行rm -f *将data子目录下的所有文件删除(文件不分前缀和后缀名)。但对于定时任务,要用crontab部署的情况下呢?问题就出在这里,笔者测试,利用crontab将该shell部署后,设置定时时间,到点后通过重定向生成的日志中,看到sqlldr_dir打印到日志中的值并不是/home/coner/blackall/,而是/home/coner。故可以推断到,上面的删除代码,当用定时任务部署的时候,$sqlldr_dir/$sqlldr_data_dir的值就为/home/coner/data,而在系统A上/home/coner目录下没有此目录,即cd 操作失败,系统抛出异常(及时碰巧有这个目录data,也是误删除文件的操作)。接着执行下面的rm -f *。此时,crontab命令对于该shell脚本所在位置的解析为/home/coner,故在执行rm -f *的时候就将/home/coner目录下的所有文件全部删除掉了,这样就造成误删除文件的恶果。郁闷+揪心中...不过幸运的是,执行脚本前有做手工的文件备份。鉴于上面情况,笔者将shell脚本重新进行了审核,将sqlldr_dir=`pwd`换成sqlldr_dir=/home/coner/blackall,并对cd操作加上异常保护。代码如下:
#!/bin/shsqlldr_dir=/home/coner/blackallsqlldr_data_dir="data"cd&$sqlldr_dir/$sqlldr_data_dir&&/dev/null&2&&1if&[&$?&-ne&0&]&&&&&then&&&&&&&&&&&echo&"the&path&of&$sqlldr_dir/$sqlldr_data_dir&invalid.."&&&&&&&&&&exit&&&&&&&else&&&&&&&&&&echo&"begin&rm&-f&$sqlldr_dir/$sqlldr_data_dir/*.txt"&&&&&&&&&&rm&-f&*.txtfi
或者在能确定路径的情况下直接写成定值: rm -f /home/coner/blackall/data/*.txt对于crontab命令执行定时任务,和登录系统后,在用户coner下手工执行shell是有区别的。前者在执行脚本时候,解析pwd命令只能解析到当前用户即coner目录为止,即上面的sqlldr_dir的值为/home/coner,而在用户coner下手工执行shell是在解析pwd命令时可以正常解析到/home/coner/blackall。这个和shell脚本初始化.profile(Unix)或.bash_profile(Linux)没有关系,即使在脚本中进行下面的初始化操作:
#&if&HP-UX&and&AIXif&[&-f&/home/zxin10/.profile&]&then&&&&&&&&&&echo&"INIT&profile&TO&UNIX"&&&&&&&&&&.&/home/zxin10/.profilefi#&if&Linuxif&[&-f&/home/zxin10/.bash_profile&]&&&&&&&&&&&then&&&&&&&&&&echo&"INIT&bash_profile&TO&LINUX"&&&&&&&&&&&.&/home/zxin10/.bash_profilefi
在用crontab执行脚本时,解释pwd的时候,sqlldr_dir的值还是/home/coner。上面的初始化脚本,主要是针对利用crontab部署定时任务时,因为crontab启动的命令并不读当前的.profile,因此所有的程序需要的环境变量需要用程序或shell自己去设置(和手工执行shell不同,手工执行shell是在某个登录用户下执行的,登录该用户之后,就已经初始化了环境变量配置文件),那么在shell中调用第三方软件的一些命令(如Oracle的sqlplus和sqlldr等命令)时,如果程序中直接写成sqlplus或sqlldr命令来调用时,脚本是识别不到这些命令的。在定时任务执行完毕后的系统邮件(mail命令查看)中会提示找不到该命令。解决方法就是在执行shell脚本的业务逻辑前先初始化操作系统的环境变量配置文件.profile或.bash_profile。如果不初始化也可以,那么在shell中调用这些命令时,需要将其写成绝对路径,如:/home/oracle/oracle92/bin/sqlldr这样的形式。
阅读(4155)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'crontab定时任务路径注意事项',
blogAbstract:'转自:'
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 crontab 脚本不执行 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信