再见 Crontab!Linux 定时任务的新选择!

引言

说到 Linux 下定时执行任务,大多数人可能会想到 crontab?没错,它的确是 Linux 下比较通用和方便的方式,但是今天我来介绍一种新的方法来创建定时任务并且支持更多更强大的功能。

Systemd

很多小伙伴应该听说过 Systemd,它是 Linux 自带的系统工具,已经成为大多数发行版的标准配置。它是用来代替 initd 进程的,解决了 initd 进程的一些问题,成为了系统的1 号进程(PID=1)。

Systemd 相比于 crontab,有很多优点:

  • 一个任务可以拆分成多个任务,任务之间可以有依赖关系

  • 方便的查询日志,自带日志工具和命令

  • 可以对任务启用资源限制,例如限制 CPU 和内存的使用

关于 Systemd 的使用和介绍,这里不讲太多,后面再详细讲。今天分享通过 Systemd 来实现定时任务的方法。

一个小例子

先来准备一个小例子:

echo `date` >> /tmp/data.txt

执行脚本,脚本会在 tmp 目录的 data 文件中输出当前的时间,正好可以验证脚本是否在正常运行,别忘了给脚本加可执行权限(chmod +x hello.sh)。

先执行脚本看下效果:

image-20250120224144129

脚本可以正常运行了。

Systemd unit

想要使用 Systemd 实现定时任务,要先创建一个Systemd 单元,Systemd 的单元是 Systemd 中最小功能单位,可以理解为一个进程的描述。一个任务就是一个单元,单元之间可以相互依赖也可以相互调用,多个单元可以组成一个大的任务管理系统。

Systemd 单元有很多种类,最常见的 Service 负责后台服务,Slice 负责资源分配,mount 负责挂载文件系统,Timer 负责定时任务等等。

单元描述符一般在系统中的三个目录中保存,分别是:

  • /usr/lib/systemd/system:用户自己定义的单元描述符文件
  • /etc/systemd/system:用户安装的软件所对应的单元描述符文件
  • /lib/systemd/system:系统自带的单元描述符文件

可以使用 systemctl 命令查看所有的单元描述符文件,也可以单独查看某一个分类的文件。

# 查看所有 Service 单元
systemctl list-unit-files --type service
# 查看所有的 timer 单元
systemctl list-unit-files --type timer
# 查看所有 mount 单元
systemctl list-unit-files --type mount
# 查看所有的单元
systemctl list-unit-files

管理命令

现在有了单元描述符文件后,我们还需要通过 systemctl 命令来管理进程。

常用的命令有:

# 启动进程
systemctl start 单元名
# 停止进程
systemctl stop 单元名
# 查看单元状态
systemctl status 单元名
# 开机自启
systemctl enable 单元名
# 关闭开机自启
systemctl disable 单元名

Service 单元

要想使用 Systemd 来实现定时任务,还需要新建两个文件,一个用来描述单元的基本信息,例如启动命令,执行的路径,单元依赖等等。还有一个文件是用来定时执行任务,类似于 crontab,用来定义什么时候执行任务。

先说 Service 单元,新建一个单元,例如 demo.service,放到 /usr/lib/systemd/system 目录下,内容如下:

[Unit]
Description=my hello.sh[Service]
ExecStart=/bin/bash /root/hello.sh

先查看一下刚才新建的单元状态:

root@debian:~# systemctl status hello.service 
○ hello.service - hello.shLoaded: loaded (/lib/systemd/system/hello.service; static)Active: inactive (dead)

现在是停止的状态,因为我们还没有启动它。执行命令 systemctl start hello.service 启动它。

root@debian:~# systemctl status hello.service 
○ hello.service - hello.shLoaded: loaded (/lib/systemd/system/hello.service; static)Active: inactive (dead)
root@debian:~# systemctl start hello.service 
root@debian:~# systemctl status hello.service 
○ hello.service - hello.shLoaded: loaded (/lib/systemd/system/hello.service; static)Active: inactive (dead)Jan 21 08:41:43 debian systemd[1]: Started hello.service - hello.sh.
Jan 21 08:41:43 debian systemd[1]: hello.service: Deactivated successfully.

可以看到, 程序正常启动了,但是后来又停止了,因为它只有一行代码,执行了 echo 之后就停止了,符合预期,下面我们让它来定时执行。

注意:在 ExecStart 字段中的命令要写绝对路径,因为 Systemd 不会自动加载环境变量,不写绝对路径会找不到可执行文件。

Timer 单元

为了可以定时执行任务,还需要新建一个 timer 单元来定义如何定时执行刚才创建的单元。新建一个 hello.timer,还是放到刚才的目录中,内容为:

[Timer]
OnUnitActiveSec=5s # 每隔多久执行任务
AccuracySec=1ms #设置时间精度,如果不设置的话,具体的执行时间就不一定了
Unit=hello.service # 要执行哪个任务[Install]
WantedBy=multi-user.target

有一个 Install 字段,这个字段在几乎每个单元中都会有,可以说是很常用或者说比较基本的一个字段,它的意思是多用户模式,可以简单理解为只要系统是以多用户模式启动的,那么这个任务就会被定时执行。

现在我们启动定时器看看:

# 别忘了编辑了单元文件后先执行下面的命令重载单元文件,不然可能会不生效
systemctl daemon-reload
# 启动定时器
systemctl start hello.timer

查看一下命令是否正常执行,看下输出的日志:

root@debian:~# cat /tmp/data.txt Tue Jan 21 09:17:13 AM EST 2025
Tue Jan 21 09:17:18 AM EST 2025
Tue Jan 21 09:17:23 AM EST 2025
Tue Jan 21 09:17:28 AM EST 2025

发现日志可以正常输出,说明我们新建的单元被正常的定时调度执行了。

开机自启

上面的配置只能保证系统不重启的情况下定时执行,如果要想实现开机自启的话,要记得执行命令:

root@debian:~# systemctl enable hello.timer
Created symlink /etc/systemd/system/multi-user.target.wants/hello.timer → /lib/systemd/system/hello.timer.

它会创建一个软连接到 user.target.wants 目录中,在系统启动的时候自动加载并执行这些任务。

如果想要关闭开机自启的话,执行 systemctl disable hello.timer 命令即可。

查看日志

Systemd 和 crontab 最大的优点我觉得是日志,crontab 只能通过程序打印的日志才能知道它到底有没有执行,Systemd 自带完善的日志系统可以很方便的查看日志。

因为刚才的脚本只输出了时间到文件中,没有打印日志到控制台,所以我们加一行 echo,然后再来查看日志。

echo `date` >> /tmp/data.txt
echo `date`

查看日志使用 journalctl 命令:

journalctl -u hello.service

image-20250121223941914

总结

使用 Systemd 来设置定时任务,虽然上面说了那么多,其实就两件事,写两个文件,一个文件定义需要执行什么命令,另一个文件定义什么时候执行命令,然后记得重载单元文件,然后启动定时器并且设置开机自启即可。

本文章首发于个人博客 LLLibra146’s blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5736.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下本地部署安装hadoop+scala+spark-【不需要虚拟机】

注意版本依赖【本实验版本如下】 Hadoop 3.1.1 spark 2.3.2 scala 2.11 1.依赖环境 1.1 java 安装java并配置环境变量【如果未安装搜索其他教程】 环境验证如下: C:\Users\wangning>java -version java version "1.8.0_261" Java(TM) SE Runti…

2.5G PoE交换机 TL-SE2109P 简单开箱评测,8个2.5G电口+1个10G光口(SFP+)

TPLINK(普联)的万兆上联的2.5G网管交换机TL-SE2109P简单开箱测评。8个PoE 2.5G电口,1个万兆SFP上联口。 2.5G交换机 TL-SE2420 简单开箱评测,16个2.5G电口4个10G光口(SFP):https://blog.zeruns.com/archives/837.html…

simulink入门学习01

文章目录 1.基本学习方法2.图形环境--模块和参数3.激活菜单---添加到模型3.1输入选项3.2添加到模型3.3更改运算3.4验证要求 4.乘以特定值--Gain模块4.1引入gain模块4.2更改增益参数4.3接入系统4.4大胆尝试 1.基本学习方法 今天突然想要学习这个simulink的相关知识,…

等变即插即用图像重建

大家读完觉得有帮助记得关注和点赞!!! 摘要 即插即用算法为解决反问题成像问题提供了一个流行的框架,该框架依赖于通过降噪器隐式定义图像先验。这些算法可以利用强大的预训练降噪器来解决各种成像任务,从而避免了在每…

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者:来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫,将网站索引到 Elasticsearch 中,然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo:https://github.com/Gunner…

java开发,IDEA转战VSCODE配置(mac)

一、基本java开发环境配置 前提:已经安装了jdk、maven、vscode,且配置了环境变量 1、安装java相关的插件 2、安装spring相关的插件 3、vscode配置maven环境 打开 VsCode -> 首选项 -> 设置,也可以在setting.json文件中直接编辑&…

Autosar CP中SWC收发LIN消息的函数调用流程原理解析

Part 1:SWC发送 在AUTOSAR架构中,软件组件(SWC,Software Component)要发送LIN消息时,通常通过COM模块的接口来发起请求。这是因为COM模块是AUTOSAR架构中负责信号和数据传输的核心模块,它为SWC提…

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

目录 设计思路 1.为什么不直接用FlinkCDC要重写Flink Gauss CDC 2.存量同步的逻辑是什么 2.1、单主键的切片策略是什么 2.2、​​​​​复合主键作切片,怎么保证扫描到所有的数据 3、增量同步的逻辑是什么 4、存量同步结束之后如何无缝衔接增量同步 5、下游数据如何落…

C#,入门教程(06)——解决方案资源管理器,代码文件与文件夹的管理工具

上一篇: C#,入门教程(05)——Visual Studio 2022源程序(源代码)自动排版的功能动画图示https://blog.csdn.net/beijinghorn/article/details/124675293 大家平时都怎么管理源代码与文件夹呢?世界上最好的集成开发环境…

【时时三省】(C语言基础)文件的顺序读写

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 文件顺序读写 示例: 这个会输出bit 如果把写文件的内容屏蔽掉 它就会把它清空 流 高度抽象的概念 可以往流里面写数据 c语言程序,只要运行起来,就默认…

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…

Bigemap pro批量设置属性/填充字段

在图层里面有大量点位或者线面需要批量编辑时,可以借助bigemap pro软件来进行编辑修改 第一步:在对应图层点击右键,选择样式,选择需要修改的点线面来设置图标、大小等,如图所示: 第二步:设置要…

全球化趋势与中资企业出海背景

1. 全球化趋势与中资企业出海背景 1.1 全球经济格局变化 全球经济格局正经历深刻变革,新兴经济体崛起,全球产业链重塑,中资企业出海面临新机遇与挑战。据世界银行数据,新兴市场和发展中经济体在全球 GDP 中占比已超 40%&#xff…

汇编与逆向(二)-汇编基础

一、汇编入门 (一)x86体系的CPU的工作模式 有两种基本的工作模式:实模式和保护模式。 实模式:也称为实地址模式,该模式最早被DOS,win9x所支持。可访问1M内存,可直接访问硬件,如对…

【游戏设计原理】77 - 沙盒与导轨

沙盒式体验和导轨式体验是游戏设计中两种截然不同的理念和手法,它们各自的特性和目标受众决定了其适用场景和设计思路。以下是对这两种体验的理解: 一、沙盒式体验 核心特点 自由度高:沙盒游戏给予玩家极大的自由,让他们自己决定…

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验,我自身也在不断的学习当中,如果文章有写的不对的地方,欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…

Python的进程和线程

ref 接受几个设定: 进程是一家almost密不透风的公司,缅甸KK园区 线程里面工作的…人 进程**[园区]**内公共资源对于进程来说,可以共享. 别的园区[进程],一般不能和自己的园区共享人员资源,除非… 好的,现在再接受设定: 单个CPU在任一时刻只能执行单个线程,只有…

消息队列篇--原理篇--Pulsar和Kafka对比分析

Pulsar和Kafka都是高性能、分布式的消息队列系统,广泛应用于大规模数据流处理和实时分析场景。然而,它们的设计哲学、架构特点和适用场景存在显著差异。以下是Pulsar和Kafka的详细对比,帮助你根据具体需求选择最合适的技术。 1、架构设计 P…

Git实用指南:忽略文件、命令别名、版本控制、撤销修改与标签管理

目录 1.忽略特殊文件 1.1.那如何配置我们需要忽略的文件的呢? 1.2.如何检验效果? 2.给命令配置别名 3.基本操作之版本回退 3.1.使用场景: 3.2.使用方法: 4.撤销修改 情况一:对于工作区的代码,还没…

Saas Paas Iaas服务区别

Saas、Paas和Iaas是云计算中常见的服务模式,它们分别代表软件即服务(Software as a Service)、平台即服务(Platform as a Service)和基础设施即服务(Infrastructure as a Service)。仅供大家参考…