systemd定时器Timer的实现

本文介绍了如何利用systemd定时器创建一个每分钟监控nginx进程CPU利用率的服务,包括服务的创建、计时器配置、系统重载、启动计时器以及结果验证。此外,还提供了OnCalendar设定格式的三种示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

systemd定时器的作用及使用场景

通过一个计时器和一个服务进行关联,达到每分钟调用的目的
1、创建一个监控nginx进程cpu利用率的服务

[root@web1 ~]# cd /usr/lib/systemd/system
[root@web1 system]# vim nginx_cpu.service
[Unit]
Description=monitor the cpu utilization of nginx process

[Service]
Type=forking
ExecStart=/root/nginx_cpu.sh

[Install]
WantedBy=multi-user.target
#################################################################################
[root@web1 ~]# vim nginx_cpu.sh			//监控nginx进程cpu利用率脚本
#!/bin/bash
#monitorthe cpu utilization of nginx process
date=`date +"%Y-%m-%d %H:%M:%S"`
nginx_cpu=`ps -aux|grep nginx|awk '/worker process/{print $3}'`
result=`echo "$nginx_cpu > 0.5"|bc`
if [ $result -eq 1 ]; then
     #nginx进程cpu利用率高于0.5时发送告警邮件给root
     echo "At $date, the cpu utilization of nginx is greater than 0.5"|mail -s "nginx_cpu" root		
fi

2、创建计时器

[root@web1 system]# vim nginx_cpu.timer
[Unit]
Description=run nginx_cpu.sh every one minutes

[Ti
<think>好的,我现在需要在Ubuntu系统上配置Systemd定时器,使用ntp工具每10分钟同步时间到ntp.aliyun.com。这个问题看起来涉及几个步骤,我得先理清楚流程。 首先,用户提到使用ntp工具,但Ubuntu默认可能使用timesyncd或者chrony。可能需要确认当前系统使用的是哪个时间服务。如果是ntpd的话,可能需要先安装。不过现在很多系统可能已经转向systemd-timesyncd,或者使用chrony作为替代。比如,Ubuntu 18.04之后可能默认使用systemd-timesyncd,但用户可能需要安装ntp包。我需要先检查是否安装了ntp,如果没有,安装它。 接下来,配置ntp服务器地址。ntp的配置文件通常是/etc/ntp.conf,需要编辑这个文件,添加server ntp.aliyun.com。可能需要注释掉原有的服务器地址,或者保留几个备用。不过用户要求只用ntp.aliyun.com,所以应该替换或添加这行。 然后,重启ntp服务,让配置生效。使用systemctl restart ntp或者ntpd,具体取决于服务名称。如果服务名不同,比如有的系统可能用ntp.service,或者需要检查服务状态是否正确。 接下来,设置Systemd定时器Systemd定时器需要两个部分:一个.service文件定义执行的任务,一个.timer文件定义触发时间。用户想要每10分钟运行一次,所以需要创建一个定时器单元,比如sync-time.timer,并设置OnUnitActiveSec=10m或者OnCalendar=*:0/10,但需要确认哪种方式更适合重复执行。 然后,创建对应的服务单元文件,比如sync-time.service,其中执行命令可能是/usr/sbin/ntpq -pn或者直接调用ntpdate?不过ntp通常是以服务形式运行,持续调整时间,而ntpdate是一次性同步。可能用户想要的是定期强制同步,这时候可能需要使用ntpdate命令,但需要注意ntpdate可能已经被弃用,或者需要单独安装。或者,如果使用ntpd,可能可以通过重启服务来触发同步,但这不是最佳做法。或者更好的方式可能是在服务文件中执行ntpd -gq,强制同步。需要具体查阅如何手动触发ntp同步。 或者,可能用户更简单的方式是直接使用systemd-timesyncd,但用户明确要求用ntp工具,所以可能需要用ntpd或者chrony。不过这可能会有冲突,如果同时运行多个时间服务的话。所以可能需要先停止并禁用systemd-timesyncd,然后启用ntp服务。 现在,假设已经正确配置了ntp.conf,并且ntp服务在运行,那么创建Systemd定时器来定期执行同步。可能正确的做法是定时重启ntp服务,或者使用ntpq命令触发同步。但不确定这样做是否有效。或者,可能需要编写一个脚本,调用ntpdate -u ntp.aliyun.com,然后通过服务单元来执行这个脚本,然后设置定时器每10分钟运行一次这个服务。不过ntpdate可能需要安装,并且需要确保在服务运行时网络可用。 可能用户需要安装ntpdate,然后在服务单元中执行ntpdate ntp.aliyun.com。例如: 在/etc/systemd/system/sync-time.service中: [Unit] Description=Sync time with ntp.aliyun.com [Service] ExecStart=/usr/sbin/ntpdate ntp.aliyun.com 然后,创建sync-time.timer: [Unit] Description=Run time sync every 10 minutes [Timer] OnCalendar=*:0/10 AccuracySec=1s Persistent=true [Install] WantedBy=timers.target 然后启用并启动定时器。不过需要注意,ntpdate需要安装,并且在现代Ubuntu版本中可能已经被chrony取代,或者需要额外安装。比如,可能需要运行sudo apt install ntpdate。 但另一个问题是,如果系统已经在运行ntpd服务,那么使用ntpdate可能会冲突,因为ntpd会调整时间,而ntpdate是立即同步。所以可能需要停止ntpd服务,再运行ntpdate,或者允许它们共存?或者用户可能希望使用ntpd本身的配置,让其定期同步,而无需Systemd定时器。但用户明确要求使用Systemd定时器配合ntp工具,所以可能需要强制定期同步,可能更好的方式是配置ntpd并让它自动处理,但用户可能希望额外增加定时触发。 或者,是否可以通过Systemd定时器来重启ntp服务,从而触发同步?比如,服务单元中执行systemctl restart ntp,但这样可能不太合适,因为频繁重启服务可能影响其正常运行。所以可能更稳妥的是通过ntpdate来执行一次同步,而不需要长时间运行的服务。 因此,步骤可能如下: 1. 安装ntpdate:sudo apt install ntpdate 2. 创建Systemd服务单元文件sync-time.service,执行ntpdate命令。 3. 创建对应的定时器单元文件sync-time.timer,设置每10分钟运行一次。 4. 启用并启动定时器。 另外,需要处理权限问题,因为ntpdate可能需要root权限,所以在服务单元中需要以Root身份运行。 同时,可能需要处理网络时间等待的问题,如果系统启动时网络未就绪,可能需要配置服务单元中的依赖,比如After=network.target。 总结步骤: - 安装必要的ntp工具(如ntp或ntpdate) - 配置ntp服务器地址到/etc/ntp.conf或直接通过ntpdate命令 - 创建Systemd服务单元和定时器单元 - 启用定时器并测试 需要验证是否正确,可能需要检查系统日志,使用journalctl -u sync-time.service和timer,查看同步是否成功。 可能还需要处理的问题包括:防火墙是否允许NTP流量(UDP 123端口),系统时区设置是否正确,以及是否有其他时间服务冲突。 最后,测试配置是否生效,可以使用timedatectl查看时间同步状态,或者使用ntpq -p查看ntp服务器状态。</think>### 在Ubuntu中配置Systemd定时器与NTP时间同步 #### 1. 安装NTP工具 若未安装`ntpdate`或`ntp`,需先安装: ```bash sudo apt update sudo apt install ntpdate # 或安装完整ntp包:sudo apt install ntp ``` #### 2. 配置NTP服务器 若使用`ntpdate`,直接通过命令指定服务器;若使用`ntp`服务,编辑配置文件: ```bash sudo nano /etc/ntp.conf ``` 在文件中添加或修改服务器地址: ``` server ntp.aliyun.com iburst ``` 保存后重启服务(仅限使用`ntp`服务时): ```bash sudo systemctl restart ntp ``` #### 3. 创建Systemd服务单元 新建服务文件`/etc/systemd/system/sync-time.service`: ```ini [Unit] Description=Sync time with ntp.aliyun.com After=network.target [Service] Type=oneshot ExecStart=/usr/sbin/ntpdate -u ntp.aliyun.com ``` 此处使用`ntpdate -u`强制立即同步[^1]。 #### 4. 创建Systemd定时器单元 新建定时器文件`/etc/systemd/system/sync-time.timer`: ```ini [Unit] Description=Run time sync every 10 minutes [Timer] OnCalendar=*:0/10 # 每10分钟触发一次 AccuracySec=1s Persistent=true [Install] WantedBy=timers.target ``` #### 5. 启用并启动定时器 ```bash sudo systemctl daemon-reload sudo systemctl enable sync-time.timer sudo systemctl start sync-time.timer ``` #### 6. 验证配置 - 查看定时器状态: ```bash systemctl list-timers sync-time.timer ``` - 检查同步日志: ```bash journalctl -u sync-time.service ``` #### 注意事项 1. 若使用`ntp`服务,需禁用默认的`systemd-timesyncd`: ```bash sudo systemctl stop systemd-timesyncd sudo systemctl disable systemd-timesyncd ``` 2. 确保防火墙开放UDP 123端口[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值