2012-01-10 16:45:56 iteye_2529 阅读数 42
如何在unix机器上编写定时任务

在unix机器上面使用crontab命令来安排定时任务,它读取如下格式文件中的定时任务:

# min hr mday month wday command
15 03 * * * sh task.sh

文件中的每列使用tab进行分割,每个字段具体规定了人物如何执行.*表示每什么什么的意思,如mday字段使用了*,表示一月中的每天都需要执行command下面的任务脚本.具体的数字则指定了具体的时间.上面一行表示:每天的上午3点15分都执行一边tash.sh.

假设上面的文件保存为.crontab,编写好之后,执行:crontab .crontab.

如果需要查看计划了那些任务,则执行:crontab -l


ref:
http://mactips.dwhoard.com/mactips/system/schedule-automatic-tasks
2012-06-29 18:00:23 runming918 阅读数 2321

Unix系统提供了cron和at命令,使系统和用户可以定时运行一定的程序,而不需手工启动。

普通用户也可以使用crontab命令来创建和维护自己的crontab文件。由于是用户不能更改执行程序的标识的,因此用户的crontab就不需第六列──执行程序的用户身份,而只要直接跟随要执行的命令。使用 “crontab -e” 命令,使用编辑器按照相应的格式编辑自己的crontab文件,或者使用 “crontab -l ” 列出现有crontab文件的内容,当然只有root用户才能查看其他用户的crontab文件:

一般是执行crontab -e <username>,然后在里面填内容,可以man crontab获得帮助
根用户的 crontab 文件放在 /var/spool/crontab/root 中,其格式如下:

  (1)  (2)  (3)  (4)  (5)  (6)
   0   0   *   *   3   /usr/bin/updatedb
      1. 分钟 (0-60)
      2. 小时 (0-23)
      3. 日 (1-31)
      4. 月 (1-12)
      5. 星期 (1-7)
      6. 所要运行的程序

-----------------------------------------------------------------------------------  
定时执行crontab使用方法详解    
  使用方式:    
  crontab   [   -u   user   ]   filecrontab   [   -u   user   ]   {   -l   |   -r   |   -e   }    
  说明:    
  crontab   是用来让使用者在固定时间或固定间隔执行程式之用,换句话说,也就是类似使用者的时程表。-u   user   是指设定指定   user   的时程表,这个前提是你必须要有其权限(比如说是   root)才能够指定他人的时程表。如果不使用   -u   user   的话,就是表示设定自己的时程表。    
  参数:
  -e:执行文字编辑器来设定时程表,内定的文字编辑器是   VI,如果你想用别的文字编辑器,则请先设定   VISUAL   环境变数来指定使用那个文字编辑器(比如说   setenv   VISUAL   joe)    
  -r:删除目前的时程表    
  -l:列出目前的时程表    
   
  时程表的格式如下:    
  f1   f2   f3   f4   f5   program    
   
  其中   f1   是表示分钟,f2   表示小时,f3   表示一个月份中的第几日,f4   表示月份,f5   表示一个星期中的第几天。program   表示要执行的程式。    
  当   f1   为   *   时表示每分钟都要执行   program,f2   为   *   时表示每小时都要执行程式,其余类推    
  当   f1   为   a-b   时表示从第   a   分钟到第   b   分钟这段时间内要执行,f2   为   a-b   时表示从第   a   到第   b   小时都要执行,其余类推    
  当   f1   为   */n   时表示每   n   分钟个时间间隔执行一次,f2   为   */n   表示每   n   小时个时间间隔执行一次,其余类推    
  当   f1   为   a,   b,   c,...   时表示第   a,   b,   c,...   分钟要执行,f2   为   a,   b,   c,...   时表示第   a,   b,   c...个小时要执行,其余类推    
  使用者也可以将所有的设定先存放在档案   file   中,用   crontab   file   的方式来设定时程表。    
  例子:    
  每月每天每小时的第   0   分钟执行一次   /bin/ls:    
  0   7   *   *   *   /bin/ls    
   
  在   12   月内,   每天的早上   6   点到   12   点中,每隔   20   分钟执行一次   /usr/bin/backup:    
  0   6-12/3   *   12   *   /usr/bin/backup    
   
  周一到周五每天下午   5:00   寄一封信给   alex@domain.name:    
  0   17   *   *   1-5   mail   -s   \"hi\"   alex@domain.name   <   /tmp/maildata    
   
  每月每天的午夜   0   点   20   分,   2   点   20   分,   4   点   20   分....执行   echo   \"haha\"    
  20   0-23/2   *   *   *   echo   \"haha\"    
   
  注意:    
  当程式在你所指定的时间执行后,系统会寄一封信给你,显示该程式执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上   >   /dev/null   2>&1   即可。


   所有用户的crontab设置文件都放在/var/cron/tabs目录下,文件名与每个用户的用户名相同。cron中的命令执行结果将被系统使用mail寄给每个用户。在/var/cron目录下还有crontab执行的记录文件,系统管理员可以按照这个文件来检查系统安全性,检查是否有影响系统安全的程序被执行。

  /usr/lib/cron/cron.allow表示谁能使用crontab命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在,而有另外一个文件/usr/lib/cron/cron.deny,则只有不包括在这个文件中的用户才可以使用crontab命令。如果它是一个空文件表明任何用户都可安排作业。两个文件同时存在时cron.allow优先,如果都不存在,只有超级用户可以安排作业。 

  
与cron不同,at命令用于在一定的时间后或在一定的时刻执行设置好的命令。at命令使用一个时间参数表示何时执行命令,然后就从标准输入中读入要执行的命令,此时就如同在shell下操作一样输入要执行的命令,最后使用^D 退出输入命令的模式。用户不必担心真正执行命令时是否能够找到正确的程序,at会将当前shell的设置,包括环境变量,保留起来,以便在执行命令时创造一个与启动at时完全相同的执行环境。

$ at 1:00am +2days
wget ftp://ftp.cdrom.com/pub/FreeBSD/packages/All/netscape.tgz
^D
 
上面命令将在两天后的凌晨1:00时启动进程下载文件,当然at命令并不是十分精确,其执行时间只是表示大概时间,可能与标准时间存在一两分钟的差异。at也支持各种复杂的时间表示方法,可以使用hhmm,hh:mm,或者加上am或pm结尾的12小时制方式。还可以使用年月日,规定程序运行的日期:

$ at 1:00am Mar 5
echo Hello | mail root
^D
Job 5 will be executed using /bin/sh
$ atq
Date                    Owner   Queue   Job#
01时00分00秒 00/03/05   root    c       5
$ atrm 5
 
用户的at程序执行结果也被系统邮寄给该用户,用户可以使用mail来查看程序的输出结果或执行错误。当用户启动at命令之后,可以使用atq命令来查看自己还没有执行的at命令,如果atq是由root执行,则将列出系统中所有没有执行的at命令。然后可以使用atrm命令根据atq输出Job号来删除at作业。

系统使用/var/at/at.allow和/var/at/at.deny文件来配置可以使用at命令的用户,和不可以使用at命令的用户。其中at.allow的优先权更高,如果存在at.allow,就只允许这个文件中列出的用户使用at,而不考虑任何不在这个文件中列出的用户。因此可以使用一个空at.allow文件禁止所有用户使用at。当不存在at.allow文件的时候,那么凡不在at.deny文件中列出的用户都可以使用

 

2013-03-15 20:03:58 cozzw 阅读数 316
#include <iostream>
#include <sys/time.h>
#include <signal.h>
using namespace std;


int n=0;
void timefunc(int sig)
{
signal(SIGPROF, timeunc);
cout<<"SIGPROF: "<<n++<<endl;
}


int main()
{
struct itimerval value;
value.it_value.tv_sec=1;
value.it_value.tv_usec=500000;
value.it_interval.tv_sec=1;
value.it_interval.tv_usec=500000;


signal(SIGPROF, timefunc);
setitimer(ITIMER_PROF, &value, NULL);
for(;;);
}




超时:
  终端I/O超时:
  #include <iostream>
  #include <sys/ioctl.h>
  using namespace std;


  int main()
  {
char ch;
struct termio new, old;
ioctl(0, TCGETA, &old);
new = old;
new.c_lflag &= ~ICANON;//接受标准输入
new.c_cc[VMIN] = 0;
new.c_cc[VTIME] = 30;//读入字符或者3秒后返回
ioctl(0, TCSETA, &new);


if(read(0, &ch, 1) != 1)
cout<<"time out"<<endl;
else
cout<<"have read: "<<ch<<endl;
ioctl(0, TCSETA, &old);
  }
2012-12-28 17:55:37 kadwf123 阅读数 542

背景,在工作中,我们经常会遇到需要定时调用某个过程的时候,这时候定时调用就显的特别有用。

下面我将我最常用的两种方法介绍给大家。

一.就是通过oracle数据库的job定时调用:

1.job的编写:

begin
  sys.dbms_job.submit(job => :job,
                      what => 'declare
    vo_errcode varchar2(200);
    vo_errmsg  varchar2(200);
begin
  staff_test_1(vo_errcode,vo_errmsg);
end;',
                      next_date => to_date('28-12-2012 11:06:00', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'sysdate+3000');
  commit;
end;
/


表示定时设置28-12-2012 11:06:00的时候去调用staff_test_1(vo_errcode,vo_errmsg);这个过程。

当然创建job直接用plsql的new job就很方便

2.附上过程代码:

create or replace procedure staff_test_1(vo_errcode      out varchar2,
                                        vo_errmsg   out varchar2)
is
begin
  insert into tp_staff_info_interface_1(STAFF_ID,SERIAL,BRANCHE_SERIAL,CITY,USER_TYPE,USER_MODE,NAME,STATUS,BIRTHDAY,BIRTHPLACE,ID_NUMBER,EDUCATION,CERTIFICATE,TELE,ENTRY_TIME,QUIT_TIME,FOREIGN,ADDRESS,SEX,DUTY,SPECIALITY,PROFESSIONAL,CDMA,AREA,STD_ROLE,EFF_DATE,EXP_DATE,MAP_ID,ORG_ID,BSS_ROLE,AGT_TML )
  select STAFF_ID,SERIAL,BRANCHE_SERIAL,CITY,USER_TYPE,USER_MODE,NAME,STATUS,to_char(BIRTHDAY,'yyyy-mm-dd hh24:mi:ss'),BIRTHPLACE,ID_NUMBER,EDUCATION,CERTIFICATE,TELE,ENTRY_TIME,QUIT_TIME,null,ADDRESS,SEX,DUTY,SPECIALITY,PROFESSIONAL,CDMA,AREA,null,to_char(EFF_DATE,'yyyy-mm-dd hh24:mi:ss'),to_char(EXP_DATE,'yyyy-mm-dd hh24:mi:ss'),MAP_ID,ORG_ID,BSS_ROLE,AGT_TML
  from V_STAFF_JS_TEMP@to_jsappt_xsqd;
  commit;
  vo_errcode := '0';
  vo_errmsg  :='ok';
  exception
  when others then
  vo_errcode   := sqlcode;
  vo_errmsg    := substr(sqlerrm, 1, 100);
  --p_write_alert('21', '3', '200', 'p_get_param:'||vo_errmsg, vo_errcode);
end staff_test_1;

二 unix后台crontab调用

1.shell脚本

#!/bin/sh
. /yjjsdata/optps/.profile
v_month=''$1''
v_priority=$2
echo $v_month
echo $v_priority
sqlplus scott/*****@130_JSYJ <<EOF
variable vo_return varchar2(2000)
variable vo_errmsg varchar2(2000)
  execute  p_get_data_ctr($v_month,$v_priority,:vo_return,:vo_errmsg);
disconnect
exit
EOF
脚本接受两个入参,分别将两个入参赋值给两个变量:v_month和v_priority,然后通过sqlplus连接oracle数据库,用户名/ 密码@数据库名

然后声明两个sql变量,分别为vo_return和vo_errmsg然后直接调用p_get_data_ctr()这个过程,将shell接受的两个变量v_month和v_priority当过程的入参,将声明的两个变量vo_return和vo_errmsg当做出参。调用玩断开连接并退出。

2.给出过程的结构:

create or replace procedure p_get_data_ctr
       (vi_month in varchar2,
       vi_priority in number,
       vo_return      out   number,
       vo_message     out   varchar2) is
  vv_return  number;
  vv_message varchar2(255);

begin
  --返回值初始化
  vo_return:=0;
  vo_message:='OK!';
  --do what you want to do!
  exception
    when others then
      rollback;
      vo_return := sqlcode;
      vo_message  := substr(sqlerrm, 1, 255);
  --p_write_alert('21', '3', '100', vo_message, vo_return);

end p_get_data_ctr;

3.把你的shell脚本加入到crontab中去。

4.如果你的试验调用失败跑出譬如ora-...043:无法识别服务名这种错误你就该考虑在你的tnsnames.ora文件中加上被访问数据库的tns了。

至此,两种定时调用介绍完毕。


2018-06-21 19:07:42 Jahol_Fan 阅读数 135
 COBOL Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void timer_callback_handler(int iSigNum)
{
    printf("22222122\n");
}
void init_soft_timer(int init_sec, int inter_sec)
{
    signal(SIGALRM, timer_callback_handler);
    struct itimerval tm;
    tm.it_value.tv_sec = init_sec;
    tm.it_value.tv_usec = 0;   //如果想用微秒延时,请传参数
    tm.it_interval.tv_sec = inter_sec;
    tm.it_interval.tv_usec = 0//如果想用微秒延时,请传参数
    if(setitimer(ITIMER_REAL, &tm, NULL) == -1) {
        perror("setitimer error");
        exit(-1);
    }
}
int main()
{
    init_soft_timer(10);
    while(1) {
        sleep(3);
        printf("11111111111111111\n");
    }
    return 0;
}
如果17行赋值,则是周期性定时器,不赋值,则是单次定时器

unix命令

阅读数 32

unix深入篇

阅读数 560

没有更多推荐了,返回首页