目录
(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
编辑查看脚本是否按要求执行:cat /root/syslog.sh(8)补充:停止服务命令:systemctl stop boot_backup.timer
在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_create
、timer_settime
、timer_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 机制
虽然 select
、poll
和 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)具有一些显著的优势。以下是其主要优势:
- 功能全面且灵活:Systemd Timers能够覆盖cron的所有功能,并提供更灵活的定时选项。除了支持基于时间的定时任务外,它还可以基于事件触发任务,这提供了更多的灵活性和应用场景。
- 日志收集与统一管理:Systemd Timers可以将所有相关的日志统一收集到systemd日志中,这使得日志的管理和查看更加便捷。通过查看统一的日志,管理员可以更容易地追踪和调试问题。
- 更精确的时间配置:Systemd Timers提供了比cron更详细的时间配置选项。这使得管理员可以更精确地控制任务的执行时间,以满足特定的需求。
- 丰富的使用与运维命令集:Systemd Timers提供了丰富的使用和运维命令集,这使得管理员可以更轻松地管理和控制定时任务。无论是创建、修改还是删除任务,都可以通过简单的命令完成。
- 确保在系统重启时执行任务:即使系统在预期的执行时间内关闭,systemd定时器也能确保任务在系统再次启动时执行。这确保了任务的可靠性和持续性。
- 对所有用户可用:Systemd Timers对所有用户都可用,这意味着不仅管理员可以创建和管理定时任务,普通用户也可以根据自己的需求进行配置。
- 便于测试和调试:Systemd Timers允许管理员在它将要运行的环境中测试和调试执行,这有助于确保任务的正确性和可靠性。
然而,需要注意的是,虽然Systemd Timers具有许多优势,但其配置相对复杂,至少需要两个配置文件。因此,如果现有的cron或anacron配置已经能够满足需求,那么可能没有必要改变。但无论如何,Systemd Timers至少值得研究,因为它有可能简化现有的cron/anacron工作方式。
总的来说,Systemd Timers定时器通过提供全面的功能、灵活的定时选项、精确的时间配置、丰富的命令集以及确保任务可靠执行的能力,为Linux系统管理员提供了更强大和高效的定时任务管理工具。