Linux应用编程:systemd timers定时器的使用(Red cat9)

目录

一、几种常见定时器介绍

setitimer/getitimer 定时器s

POSIX定时器

使用 select/poll/epoll 机制

cron

systemd timers

其他脚本中的定时器

二、Systemd Timers定时器使用

(1)编写任务脚本文件(文件名为time_test.sh)vi /root/time_test.sh

(2)编写服务单元文件(文件名为boot_backup.service)vi /etc/systemd/system/boot_backup.service

(3)编写定时器单元文件(文件名为boot_backup.timer)vi /etc/systemd/system/boot_backup.timer

(4)重载单元文件 systemctl daemon-reload(5)关闭Selinux防火墙:setenforce 0(6)打开服务:systemctl start boot_backup.service                        systemctl start boot_backup.timer(7)检查定时器服务:systemctl status boot_backup.timer

​编辑查看脚本是否按要求执行:cat /root/syslog.sh(8)补充:停止服务命令:systemctl stop boot_backup.timer

三、Systemd Timers定时器的优势


在Linux应用编程中,有几种常见的定时器机制可以使用,它们分别适用于不同的场景和需求。以下是几种常用的Linux定时器及其使用方式:

一、几种常见定时器介绍


setitimer/getitimer 定时器s

setitimer 和 getitimer 是基于信号的定时器。它们用于设置三种类型的定时器:ITIMER_REAL(实时定时器,到期时发送 SIGALRM 信号),ITIMER_VIRTUAL(进程在用户态执行时累计的CPU时间定时器,到期时发送 SIGVTALRM 信号),和 ITIMER_PROF(进程在用户态和内核态执行时累计的CPU时间定时器,到期时发送 SIGPROF 信号)。

使用示例:

#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
void timer_handler(int signum) {
printf("Timer expired!\n");
}
int main() {
struct sigaction sa;
struct itimerval timer;
/* 安装信号处理器 */
sa.sa_handler = &timer_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGALRM, &sa, NULL) == -1) {
perror("sigaction");
return 1;
}
/* 设置定时器,1秒后到期 */
timer.it_value.tv_sec = 1;
timer.it_value.tv_usec = 0;
timer.it_interval.tv_sec = 1;
timer.it_interval.tv_usec = 0;
if (setitimer(ITIMER_REAL, &timer, NULL) == -1) {
perror("setitimer");
return 1;
}
/* 等待定时器到期 */
while (1) {
pause();
}
return 0;
}

POSIX定时器

POSIX定时器提供了更高的精度和更灵活的控制。它们通过 timer_createtimer_settimetimer_gettime 和 timer_delete 等函数来创建、设置、获取和删除定时器。这些定时器可以关联到特定的线程,并且可以是周期性的或非周期性的。

使用示例:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
void timer_handler(int sig, siginfo_t *si, void *uc) {
printf("Timer expired!\n");
}
int main() {
struct sigevent sev;
timer_t timerid;
struct itimerspec its;
struct sigaction sa;
/* 设置信号处理器 */
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timer_handler;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGRTMIN, &sa, NULL) == -1) {
perror("sigaction");
return 1;
}
/* 创建定时器 */
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGRTMIN;
if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) {
perror("timer_create");
return 1;
}
/* 设置定时器时间 */
its.it_value.tv_sec = 1;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = 1;
its.it_interval.tv_nsec = 0;
if (timer_settime(timerid, 0, &its, NULL) == -1) {
perror("timer_settime");
return 1;
}
/* 等待定时器到期 */
while (1) {
pause();
}
/* 删除定时器 */
timer_delete(timerid);
return 0;
}

使用 select/poll/epoll 机制

虽然 selectpoll 和 epoll 主要用于处理I/O事件,但它们也可以用来实现定时器功能。通过设置一个超时时间,可以在没有I/O事件发生时触发超时事件,从而实现定时器的效果

在Linux应用编程中,并没有直接称为“j脚本定时器”的工具或机制。但您可能是在提及几种不同的概念或工具的混合。这里,我将为您解释在Linux环境中如何设置定时任务和执行脚本。

cron

是Linux系统中用于定时执行命令或脚本的工具。您可以编辑用户的crontab文件来设置定时任务。

使用 crontab -e 命令可以编辑当前用户的crontab文件。例如,如果您想每天中午12点执行一个名为 myscript.sh 的脚本,您可以在crontab文件中添加以下行:

0 12 * * * /path/to/myscript.sh

cron 的语法是:分钟 小时 日期 月份 星期 命令。上面的例子表示在每天的12点0分执行命令。 2. **at**: at` 命令用于在指定时间执行一次性的命令或脚本。它不会反复执行,只会在指定的时间执行一次。

例如,要在5分钟后执行一个脚本,您可以这样做:

echo "/path/to/myscript.sh" | at now + 5 minutes

systemd timers

对于更现代的Linux系统,systemd 提供了一个定时器功能,允许您设置定时任务。这通常用于需要长时间运行的服务或需要定期执行的任务。

首先,您需要创建一个服务单元文件(例如 /etc/systemd/system/myservice.service),然后创建一个定时器单元文件(例如 /etc/systemd/system/myservice.timer)。在定时器文件中,您可以指定何时运行服务。
 

其他脚本中的定时器

如果您想在脚本内部实现定时器功能,您可以使用各种方法,如 sleep 命令、循环和条件判断等。但这通常用于在脚本执行过程中等待或检查某些条件,而不是用于设置长期的定时任务。

请注意,为了确保脚本能够按计划执行,您需要确保它们具有正确的执行权限(通常使用 chmod +x /path/to/script.sh 命令),并且其路径在系统的PATH环境变量中,或者您在crontab或systemd定时器中提供了完整的路径。

最后,确保您的系统时间正确设置,并且cron或其他定时工具正在运行。您可以使用 systemctl status cron 或 service cron status 命令来检查cron服务的状态。

二、Systemd Timers定时器使用


(1)编写任务脚本文件(文件名为time_test.sh)
vi /root/time_test.sh

填入:
#! /bin/bash
echo `date` >> /root/syslog.txt

wq!退出

(2)编写服务单元文件(文件名为boot_backup.service)
vi /etc/systemd/system/boot_backup.service

填入:
[Unit]
Description=Run boot backup

[Service]
Type=simple
ExecStart=/root/time_test.sh

wq!退出

(3)编写定时器单元文件(文件名为boot_backup.timer)
vi /etc/systemd/system/boot_backup.timer

填入:
[Unit]
Description=Run boot backup

[Timer]
OnUnitActiveSec=3s
AccuracySec=1us

[Install]
WantedBy=multi-user.target

wq!退出

(4)重载单元文件 systemctl daemon-reload
(5)关闭Selinux防火墙:setenforce 0
(6)打开服务:systemctl start boot_backup.service
                        systemctl start boot_backup.timer
(7)检查定时器服务:systemctl status boot_backup.timer


查看脚本是否按要求执行:cat /root/syslog.sh
(8)补充:停止服务命令:systemctl stop boot_backup.timer

三、Systemd Timers定时器的优势


Systemd Timers定时器相比其他定时工具(如cron)具有一些显著的优势。以下是其主要优势:

  1. 功能全面且灵活:Systemd Timers能够覆盖cron的所有功能,并提供更灵活的定时选项。除了支持基于时间的定时任务外,它还可以基于事件触发任务,这提供了更多的灵活性和应用场景。
  2. 日志收集与统一管理:Systemd Timers可以将所有相关的日志统一收集到systemd日志中,这使得日志的管理和查看更加便捷。通过查看统一的日志,管理员可以更容易地追踪和调试问题。
  3. 更精确的时间配置:Systemd Timers提供了比cron更详细的时间配置选项。这使得管理员可以更精确地控制任务的执行时间,以满足特定的需求。
  4. 丰富的使用与运维命令集:Systemd Timers提供了丰富的使用和运维命令集,这使得管理员可以更轻松地管理和控制定时任务。无论是创建、修改还是删除任务,都可以通过简单的命令完成。
  5. 确保在系统重启时执行任务:即使系统在预期的执行时间内关闭,systemd定时器也能确保任务在系统再次启动时执行。这确保了任务的可靠性和持续性。
  6. 对所有用户可用:Systemd Timers对所有用户都可用,这意味着不仅管理员可以创建和管理定时任务,普通用户也可以根据自己的需求进行配置。
  7. 便于测试和调试:Systemd Timers允许管理员在它将要运行的环境中测试和调试执行,这有助于确保任务的正确性和可靠性。

然而,需要注意的是,虽然Systemd Timers具有许多优势,但其配置相对复杂,至少需要两个配置文件。因此,如果现有的cron或anacron配置已经能够满足需求,那么可能没有必要改变。但无论如何,Systemd Timers至少值得研究,因为它有可能简化现有的cron/anacron工作方式。

总的来说,Systemd Timers定时器通过提供全面的功能、灵活的定时选项、精确的时间配置、丰富的命令集以及确保任务可靠执行的能力,为Linux系统管理员提供了更强大和高效的定时任务管理工具。

  • 18
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值