linux 定时任务的方法有哪些
如果我们需要定时执行一些周期性重复性的任务,我们就会用到定时执行任务功能来帮我们自动执行每天、每周等周期性重复性的任务而不需要人为干预即可实现。
我们通过crontab –e来创建自己的定时任务,下图中的5个*的含义是,第一个*是分,第二个*是小时,第三个*是日,第4个*是月,第5个*是周,第6列是命令,下图的意思是给所有人发警告信息Hello,每隔一分钟就发送一次Hello信息。
我们可以通过crontab –l来查看当前的已创建的定时任务,可以发现当前有一个定时任务,通过crontab –r删除当前的定时任务,再次通过crontab –l去查看是否还有定时任务,发现已经成功删除了。
进入/etc目录,查看首字母为cron的目录,cron*,*在这里是通配符,匹配任意个字符,通过查看/etc目录下所有与定时任务相关的目录和文件。
通过cat crontab查看定时任务的故事,包括shell的位置、路径、默认邮件发给root账户、以及定时任务的格式,5个*的含义及第6列是写具体的命令。
我们可以看看系统里面的定时任务,有每小时执行的cron.hourly、每日执行的cron.daily、每月执行的cron.monthly、每周执行的cron.weekly.我们通过命令ll cron.daily可以看到里面有很多可执行文件,这些都是系统每天自动执行的定时任务。
我们可以把自己建立的定时文件放在系统已有的目录下,比如每天的定时任务放在cron.daily下面。
系统常用的每天执行的定时任务,tmpwatch定时任务会去/tmp、/var/tmp临时目录下找超过10天的文件并删除,logrotate日志文件回滚,默认是一周回滚一次,1个月回滚4次,也就是日志只保存1个月,logwatch把当天最敏感的日志找出来形成一个电子邮件默认发给超级用户。
linux 加硬件定时器 timer 可否实时
一. Linux的硬件时间 PC机中的时间有三种硬件时钟实现,这三种都是基于晶振产生的方波信号输入。
这三种时钟为:(1)实时时钟RTC ( Real Time Clock)
我在网上搜了一个Linux下的c++定时器,但是不会用。不知道时间在哪设置,定时触发的程序添加到哪请教一下
这里是利用了一个简单定时器……
alarm的参数为秒数,在经过指定秒数后,alarm会发出一个SIGALRM信号
singal函数用来绑定信号处理器函数,这里绑定的是timer,被绑定的函数必须固定为返回值void、参数int。
只需要alarm(时间)就设置了,可能由于getchar需要进入中断导致信号被挂起所以没反应吧,可以试试把getchar换成别的东西来延时看看
在linux环境中,如何实现多线程中使用多个定时器,POSIX定时器可以吗,如何用?
个人解决了,以下是一个实现:
#include
#include
#include
#include
#include
#include
#include
#if 1
pthread_attr_t attr;
timer_t hard_timer, software_timer;
struct sigevent hard_evp, software_evp;
static void watchdog_hard_timeout(union sigval v)
{
time_t t;
char p[32];
timer_t *q;
struct itimerspec ts;
int ret;
time(&t);
strftime(p, sizeof(p), "%T", localtime(&t));
printf("watchdog hard timeout!
");
printf("%s thread %d, val = %u, signal captured.
", p, (unsigned int)pthread_self(), v.sival_int);
q = (timer_t *)(v.sival_ptr);
printf("hard timer_t:%d add:%p, q:%p!
", (int)hard_timer, &hard_timer, q);
ts.it__sec = 0;
ts.it__nsec = 0;
ts.it__sec = 6;
ts.it__nsec = 0;
ret = timer_settime(*q, CLOCK_REALTIME, &ts, NULL);
if (ret != 0) {
printf("settime err(%d)!
", ret);
}
}
static void watchdog_software_timeout(union sigval v)
{
time_t t;
char p[32];
timer_t *q;
struct itimerspec ts;
int ret;
time(&t);
strftime(p, sizeof(p), "%T", localtime(&t));
printf("watchdog software timeout!
");
printf("%s thread %d, val = %u, signal captured.
", p, (unsigned int)pthread_self(), v.sival_int);
q = (timer_t *)(v.sival_ptr);
printf("hard timer_t:%d add:%p, q:%p!
", (int)hard_timer, &hard_timer, q);
ts.it__sec = 0;
ts.it__nsec = 0;
ts.it__sec = 10;
ts.it__nsec = 0;
ret = timer_settime(*q, CLOCK_REALTIME, &ts, NULL);
if (ret != 0) {
printf("settime err(%d)!
", ret);
}
}
static void dcmi_sol_pthread_attr_destroy(pthread_attr_t *attr)
{
pthread_attr_destroy(attr);
}
static int dcmi_sol_pthread_attr_init(pthread_attr_t *attr)
{
int ret;
if ((ret = pthread_attr_init(attr) != 0)) {
goto err;
}
if ((ret = pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED)) != 0) {
dcmi_sol_pthread_attr_destroy(attr);
goto err;
}
/* 设置线程的栈大小,失败则用系统默认值 */
pthread_attr_setstacksize(attr, 128 * 1024);
return 0;
err:
printf("set ptread attr failed(ret:%d)!
", ret);
return -1;
}
int main(void)
{
struct itimerspec ts;
int ret;
ret = dcmi_sol_pthread_attr_init(&attr);
if (ret != 0) {
printf("init pthread attributes fail(%d)!
", ret);
exit(-1);
}
memset(&hard_evp, 0, sizeof(struct sigevent));
hard_evp.sigev_value.sival_ptr = &hard_timer;
hard_evp.sigev_notify = SIGEV_THREAD;
hard_evp.sigev_notify_function = watchdog_hard_timeout;
hard_evp.sigev_notify_attributes = NULL;//&attr;
memset(&software_evp, 0, sizeof(struct sigevent));
software_evp.sigev_value.sival_ptr = &software_timer;
software_evp.sigev_notify = SIGEV_THREAD;
software_evp.sigev_notify_function = watchdog_software_timeout;
software_evp.sigev_notify_attributes = NULL;//&attr;
ret = timer_create(CLOCK_REALTIME, &hard_evp, &hard_timer);
if(ret != 0) {
perror("hard timer_create fail!");
exit(-1);
}
ret = timer_create(CLOCK_REALTIME, &software_evp, &software_timer);
if (ret != 0) {
timer_delete(hard_timer);
perror("software timer_create fail!");
exit(-1);
}
ts.it__sec = 0;
ts.it__nsec = 0;
ts.it__sec = 6;
ts.it__nsec = 0;
ret = timer_settime(hard_timer, CLOCK_REALTIME, &ts, NULL);
if(ret != 0) {
perror("hard timer_settime fail!");
timer_delete(hard_timer);
timer_delete(software_timer);
exit(-1);
}
ts.it__sec = 10;
ret = timer_settime(software_timer, CLOCK_REALTIME, &ts, NULL);
if(ret != 0) {
perror("hard timer_settime fail!");
timer_delete(hard_timer);
timer_delete(software_timer);
exit(-1);
}
while(1) {
printf("main ready sleep!
");
sleep(15);
printf("main sleep finish!
");
}
return 0;
}
#endif