UNIX下的定时任务-----cron
2011-09-04 00:00
225 查看
cron是系统的主要进程调度进程(每隔一分钟被激活检查,其余时间休眠),通过读取crontab文件中的内容来定时执行任务
其中在unix下可以每一个用户拥有一个crontab文件
但为了管理员的方便,一般就一个。每一个用户是否有权限拥有crontab文件可以通过如下文件进行设置
cron.deny和cron.allow
cron中有一个crontab命令来对crontab文件进行相关操作:
-l 查看crontab文件内容
-u 用户名 指定哪个用户的crontab文件
-e 编辑crontab文件
-r 删除crontab文件
crontab filename提交作业文件
1:创建crontab文件
(1)首先确定一个编辑器,对crontab文件进行编辑,一般是vi
设置如下:在$HOME下的.profile中增加如下:
EDITOR=vi;exportEDITOR
(2)创建一个文件,如test文件(一般是用户名,不是用户名也可以)
如创建的文件内容如下:
cat $HOME/test
0,30 * * * * /bin/echo"test">/dev/console
(3)crontab test
提交的文件会在/var/spool/cron/目录下一个文件中(这个文件名记为用户,那个用户的crontab记为那个用户)
2:一般情况下,最好不要直接操作/var/spool/cron/目录下的crontab文件,这样可能会因为操作问题,造成
更改crontab文件,而影响原来设置的cron任务
那么怎么办呢,一般我们通过编辑副本来编辑crontab文件
操作如下:
(1)crontab -l >filename
(2)通过编辑filename文件,增加或删除定时任务
(3)提交filename文件(这样发现/var/spool/cron/目录下一个文件已经改变成提交的那个啦,所以切勿更改错误哦)
(4)删除filename文件(或保留这个文件,以便你恢复使用。)
以下是我在使用crontab的一个例子,供大家参考:
crontab -l
# EDITE DO XXXXX
# (/home/test/daemon_crontab_1234 instatll on xxxx)
# version xxxxx
0,30 * * * * /home/test/project/bin/test --start >dev/null 2>&1
由于每次执行crontab filename均会在上述文件中(linux系统下,其他不会)增加上述类似的三行注释来表明我修改的时间,版本信息等
故,我如下的程序做了,对于指定的任务,只有这么三行表明我修改的时间和版本信息。故做了如下处理.
以下程序是曾经写过的脚本,现在重新写了下,但未调试,如果有错,稍稍调整以下就没有多大问题了。
#!/bin/ksh
main()
{
username=$1
type=$2
project=$3 #$3项目的home目录
crontab_bak=/home/test/daemon_crontab_$$
crontab_cp=/home/test/daemon_crontab_cp_$$
crontab -l >crontab_bak
project_temp=$(echo $project|sed 's/\//\\\//g')
#awk -v project_temp=project { gsub(/\//,"\\\/",project_temp) print project_temp}
awk 'BEGIN{
status=0
buff=""
}
index($0,"'$project'/project/bin/test --start") ==0 {
if( status == -1 ){
printf("%s",$0);
}
else if( status == 0 ){
if( $0 ~ /^# EDITE DO XXXXX/ )
{
status =1;
buff=sprintf("%s\n",$0);
}
else
{
status =-1;
buff=sprintf("%s\n",$0);
}
}
else if( status == 1 ){
if( $0 ~ /^# \('$project_temp'\/daemon_crontab_1234 instatll on xxxx\)/ ){
status =2;
buff=sprintf("%s%s\n",buff,$0)
}
else
{
status =-1;
printf("%s%s\n",buff,$0);
}
}else if( status == 2 ){
if( $0 ~ /^# version xxxxx/ ){
status =0;
buff="";
}
else
{
status =-1;
printf("%s\n",$0);
}
}
}' $crontab_bak > $crontab_cp
}
if [ "x$type" = "xadd" ]; then
{
echo "0,30 * * * * /home/test/project/bin/test --start >/dev/null 2>&1" >>$crontab_cp
crontab $crontab_cp
}
if [ "x$type" = "xdelete" ]; then
{
crontab $crontab_cp
}
rm -fr $crontab_cp
rm -fr $crontab_bak
main $@ 2>/dev/null
其中在unix下可以每一个用户拥有一个crontab文件
但为了管理员的方便,一般就一个。每一个用户是否有权限拥有crontab文件可以通过如下文件进行设置
cron.deny和cron.allow
cron中有一个crontab命令来对crontab文件进行相关操作:
-l 查看crontab文件内容
-u 用户名 指定哪个用户的crontab文件
-e 编辑crontab文件
-r 删除crontab文件
crontab filename提交作业文件
1:创建crontab文件
(1)首先确定一个编辑器,对crontab文件进行编辑,一般是vi
设置如下:在$HOME下的.profile中增加如下:
EDITOR=vi;exportEDITOR
(2)创建一个文件,如test文件(一般是用户名,不是用户名也可以)
如创建的文件内容如下:
cat $HOME/test
0,30 * * * * /bin/echo"test">/dev/console
(3)crontab test
提交的文件会在/var/spool/cron/目录下一个文件中(这个文件名记为用户,那个用户的crontab记为那个用户)
2:一般情况下,最好不要直接操作/var/spool/cron/目录下的crontab文件,这样可能会因为操作问题,造成
更改crontab文件,而影响原来设置的cron任务
那么怎么办呢,一般我们通过编辑副本来编辑crontab文件
操作如下:
(1)crontab -l >filename
(2)通过编辑filename文件,增加或删除定时任务
(3)提交filename文件(这样发现/var/spool/cron/目录下一个文件已经改变成提交的那个啦,所以切勿更改错误哦)
(4)删除filename文件(或保留这个文件,以便你恢复使用。)
以下是我在使用crontab的一个例子,供大家参考:
crontab -l
# EDITE DO XXXXX
# (/home/test/daemon_crontab_1234 instatll on xxxx)
# version xxxxx
0,30 * * * * /home/test/project/bin/test --start >dev/null 2>&1
由于每次执行crontab filename均会在上述文件中(linux系统下,其他不会)增加上述类似的三行注释来表明我修改的时间,版本信息等
故,我如下的程序做了,对于指定的任务,只有这么三行表明我修改的时间和版本信息。故做了如下处理.
以下程序是曾经写过的脚本,现在重新写了下,但未调试,如果有错,稍稍调整以下就没有多大问题了。
#!/bin/ksh
main()
{
username=$1
type=$2
project=$3 #$3项目的home目录
crontab_bak=/home/test/daemon_crontab_$$
crontab_cp=/home/test/daemon_crontab_cp_$$
crontab -l >crontab_bak
project_temp=$(echo $project|sed 's/\//\\\//g')
#awk -v project_temp=project { gsub(/\//,"\\\/",project_temp) print project_temp}
awk 'BEGIN{
status=0
buff=""
}
index($0,"'$project'/project/bin/test --start") ==0 {
if( status == -1 ){
printf("%s",$0);
}
else if( status == 0 ){
if( $0 ~ /^# EDITE DO XXXXX/ )
{
status =1;
buff=sprintf("%s\n",$0);
}
else
{
status =-1;
buff=sprintf("%s\n",$0);
}
}
else if( status == 1 ){
if( $0 ~ /^# \('$project_temp'\/daemon_crontab_1234 instatll on xxxx\)/ ){
status =2;
buff=sprintf("%s%s\n",buff,$0)
}
else
{
status =-1;
printf("%s%s\n",buff,$0);
}
}else if( status == 2 ){
if( $0 ~ /^# version xxxxx/ ){
status =0;
buff="";
}
else
{
status =-1;
printf("%s\n",$0);
}
}
}' $crontab_bak > $crontab_cp
}
if [ "x$type" = "xadd" ]; then
{
echo "0,30 * * * * /home/test/project/bin/test --start >/dev/null 2>&1" >>$crontab_cp
crontab $crontab_cp
}
if [ "x$type" = "xdelete" ]; then
{
crontab $crontab_cp
}
rm -fr $crontab_cp
rm -fr $crontab_bak
main $@ 2>/dev/null
相关文章推荐
- Linux/UNIX 定时任务 cron 详解
- Linux/UNIX 定时任务 cron 详解
- Linux/UNIX 定时任务 cron 详解
- Linux/UNIX 定时任务 cron 详解
- Linux/UNIX 定时任务 cron 详解
- Spring + Quartz CronExpression静态及动态定时任务
- cron表达式详解(spring定时任务时间间隔配置)
- 继续转 [转]php版本的cron定时任务执行器
- Linux定时任务系统Cron入门
- linux定时任务的设置cron
- Spring集成Quartz定时任务框架介绍和Cron表达式详解
- ESXi添加定时计划任务Add cron Job to VMware ESX/ESXi
- Quartz 框架和cron表达式任务调度的例子(spring下实现定时发送邮件)
- springboot 中定时任务cron表达式
- CronJob定时任务
- Spring集成Quartz定时任务框架介绍和Cron表达式详解
- Linux定时任务系统cron
- Spring集成Quartz定时任务框架介绍和Cron表达式详解
- Spring 定时任务之 @Scheduled cron表达式
- 利用pycron在windows上实现cron定时任务