参考资料

  1. 【図解】cronの仕組み
  2. 定时任务 - crontab
  3. 解决ubuntu下定时任务不执行问题
  4. crontab环境变量问题💥
  5. Linux定时任务功能详解:crontab与at命令应用指南

目录

  • 一. 环境准备
    • 1.1 wsl开启systemd
    • 1.2 开启cron日志
  • 二. cron服务管理相关命令
    • 2.1 service 的方式
    • 2.2 systemctl 的方式
  • 三. 简单使用crontab定时任务
    • 3.1 编辑一个定时任务
      • 3.1.1 `crontab -e` 编辑定时任务
      • 3.1.2 通过命令行直接添加
    • 3.2 查看定时任务
      • 3.2.1 `crontab -l` 查看既存的定时任务
      • 3.2.2 `/var/spool/cron/crontabs/用户名` 文件查看
    • 3.3 删除定时任务
      • 3.3.1 `crontab -e` 编辑删除定时任务
      • 3.3.2 按关键字在命令行删除
      • 3.3.3 `crontab -r` 的方式删除
  • 四. 定时任务进阶
    • 4.1 注意事项
    • 4.2 定时任务的示例
      • 4.2.1 由于PATH引起问题的实例
      • 4.2.2 其他定时任务示例


一. 环境准备

1.1 wsl开启systemd

⏹笔者使用wsl来运行ubuntu,而 wsl 默认没有真正的 init 系统,无法使用现代 Linux 的标准服务管理工具:systemctl命令。
可通过修改/etc/wsl.conf的方式开启使用systemctl命令。如果使用的是VMware等虚拟机或者云服务器则默认会开启systemctl命令。

apluser@FengYeHong-HP:~$ ls -l /etc/wsl.conf
-rw-r--r-- 1 root root 43 Aug 14 20:50 /etc/wsl.conf
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ tail -n 2 /etc/wsl.conf
[boot]
systemd=true

⏹修改完毕/etc/wsl.conf之后,退出wsl,在PowerShell终端中执行关闭wsl的命令

wsl --shutdown

⏹然后再一次进入wsl之后,systemd init 系统就已经被启用了

  • 可通过下面的命令进行验证
apluser@FengYeHong-HP:~$ ps -p 1 -o comm=
systemd

💥注意事项💥

  • wsl1无法启用systemd init 系统,wsl2才可以。
  • 启用 systemd 后,WSL 启动会比以前慢一些,因为它会启动一堆后台服务(dbus、journald、cron 等)

1.2 开启cron日志

⏹ubuntu默认没有开cron日志,可通过修改配置文件选择是否开启。去除#既可以开启cron日志。

apluser@FengYeHong-HP:~$ ls -l /etc/rsyslog.d/50-default.conf
-rw-r--r-- 1 root root 1123 Aug 13 09:00 /etc/rsyslog.d/50-default.conf
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ grep cron /etc/rsyslog.d/50-default.conf
cron.*                          /var/log/cron.log
#       cron,daemon.none;\

⏹配置文件修改完毕之后,还需要重启一下rsyslog服务,当定时任务开始执行后,就可以在/var/log/cron.log中看到日志了。

# 这两种方式都可以
sudo systemctl restart rsyslog
sudo  service rsyslog  restart

二. cron服务管理相关命令

特性servicesystemctl
诞生时代SysV init 时代(上世纪 90 年代)systemd 时代(2010 年以后)
依赖的 init 系统SysV init / Upstart / systemd(兼容模式)只能用于 systemd
底层调用在旧系统调用 /etc/init.d/xxx 脚本,在新系统里会转到 systemctl直接通过 systemd 的 D-Bus API 管理服务
功能范围主要是启动、停止、重启、查看状态除了服务管理,还能管理开机启动、目标(target)、挂载点、设备、电源等
输出信息简单的状态行(旧模式),或 systemd 的详细状态(新模式)详细的 systemd 状态、日志、依赖关系
是否未来主流只是为了兼容旧脚本保留现代 Linux 的标准,未来主流

2.1 service 的方式

# 查看crontab服务状态
ps -ef | grep '[c]ron'
service cron status            sudo service cron start        # 启动服务
sudo service cron stop         # 关闭服务
sudo service cron restart      # 重启服务
sudo service cron reload       # 重新载入配置

2.2 systemctl 的方式

# 查看crontab服务状态
ps -ef | grep '[c]ron'
systemctl status cronsudo systemctl start cron      # 启动
sudo systemctl stop cron       # 停止
sudo systemctl restart cron    # 重启
sudo systemctl enable cron     # 开机自启
sudo systemctl disable cron    # 禁用开机自启

三. 简单使用crontab定时任务

在这里插入图片描述

3.1 编辑一个定时任务

3.1.1 crontab -e 编辑定时任务

  • 直接在命令行输入crontab -e编辑定时任务
apluser@FengYeHong-HP:~$ crontab -e
  • 输入完成之后,会使用指定的文本编辑器(此处使用的是nano编辑器)打开定时任务编辑页面

在这里插入图片描述

3.1.2 通过命令行直接添加

⏹如果定时任务的命令长度不是十分长的话,可以直接通过命令行追加

  • crontab -l 2>/dev/null:读取现有任务,如果没有就忽略错误
  • echo '...':指定定时任务的内容
  • crontab -:覆盖回 crontab,添加定时任务
(crontab -l 2>/dev/null; echo '* * * * * echo "Hello world" >> /tmp/hello.log') | crontab -

3.2 查看定时任务

3.2.1 crontab -l 查看既存的定时任务

apluser@FengYeHong-HP:~$ crontab -l
* * * * * echo "Hello world" >> /tmp/hello.log

3.2.2 /var/spool/cron/crontabs/用户名 文件查看

  • 每个用户对应的定时任务都会保存到 /var/spool/cron/crontabs/用户名 文件中
apluser@FengYeHong-HP:~$ sudo ls -l /var/spool/cron/crontabs/apluser
-rw------- 1 apluser crontab 222 Aug 13 08:52 /var/spool/cron/crontabs/apluser
apluser@FengYeHong-HP:~$ sudo cat /var/spool/cron/crontabs/apluser
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (- installed on Wed Aug 13 08:52:05 2025)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
* * * * * echo "Hello world" >> /tmp/hello.log

3.3 删除定时任务

3.3.1 crontab -e 编辑删除定时任务

crontab -e

3.3.2 按关键字在命令行删除

# 可以先将既存的定时任务备份
crontab -l > mycron.bk
# 然后通过关键词的方式删除定时任务
crontab -l | grep -v 'Hello world'
crontab -l | grep -v 'Hello world' | crontab -

3.3.3 crontab -r 的方式删除

  • 💥注意:此种方式会删除当前用户的所有定时任务,慎用。
apluser@FengYeHong-HP:~$ crontab -ir
crontab: really delete apluser crontab? (y/n) y
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ crontab -l
no crontab for apluser
apluser@FengYeHong-HP:~$ sudo ls -l /var/spool/cron/crontabs/apluser
[sudo] password for apluser:
ls: cannot access '/var/spool/cron/crontabs/apluser': No such file or directory

四. 定时任务进阶

/etc/crontab 是 系统级别的 Cron 配置文件

  • 设置一些 系统维护任务(清理日志、同步时间等)
  • 启动时执行系统服务相关脚本
  • 运行需要 root 权限的定时任务
apluser@FengYeHong-HP:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.SHELL=/bin/sh
# You can also override PATH, but by default, newer versions inherit it from the environment
#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

4.1 注意事项

  • PATH变量被精简
    • 🔷在交互式 shell 里,PATH 可能很长,例如
    /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:...
    
    • 🔷但 cron 里常常只有
    /usr/bin:/bin
    
  • HOME变量可能不同
    • 交互 shell 下的 HOME 一般是当前用户的家目录,但 cron 可能会是 / 或其他值。
    • 如果脚本依赖 ~相对路径,建议使用绝对路径
  • ⏹不会加载 ~/.bashrc~/.profile
    • cron 不会读取你时登录时加载的配置文件,所以环境变量、别名、函数都可能丢失。
    • 如果脚本依赖这些配置,可以在任务里手动加载
  • SHELL 变量可能不同
    • cron 默认使用 /bin/sh(在很多系统上是 dash),而不是 /bin/bash
    • 如果脚本里用了 bash 特性([[ ]]{1..5}source 等),除了在脚本内指定Shebang之外,还可以再定时任务编辑界面添加
    SHELL=/bin/bash
    
  • %的特殊含义
    • 在 crontab 中 % ,表示换行(相当于把它后面的内容当作命令的标准输入 STDIN)。
    • 如果要在命令里用 %,必须写成 \% 才能被当作普通字符。
    • # 在终端执行会输出 Hello%World
      # 但是放进 crontab 里会变成
      #     命令:echo "Hello"
      #     标准输入:World
      * * * * * echo "Hello%World"
      

4.2 定时任务的示例

4.2.1 由于PATH引起问题的实例

  • PATH变量在交互式shell中,会输出很多内容
apluser@FengYeHong-HP:~$ echo "$PATH" | xargs -d ':' -L 1 | grep -v '威' | wc -l
48
apluser@FengYeHong-HP:~$ echo "$PATH" | xargs -d ':' -L 1 | grep -v '威' | head
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/usr/lib/wsl/lib
/mnt/c/Program Files (x86)/VMware/VMware Workstation/bin/
  • 但我们在corn定时任务中使用了PATH之后,只会输出很少的内容
apluser@FengYeHong-HP:~$ crontab -l
SHELL=/bin/bash
* * * * * /home/apluser/work/0815/bash_test.shapluser@FengYeHong-HP:~$ cat /home/apluser/work/0815/bash_test.sh
#!/usr/bin/env bash
echo "$PATH" | xargs -d ':' -L 1 | grep -v '威' >> /home/apluser/work/corn1.logapluser@FengYeHong-HP:~$ tail /home/apluser/work/corn1.log
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/binapluser@FengYeHong-HP:~$

4.2.2 其他定时任务示例

# 实例1:每1分钟执行一次myCommand
* * * * * myCommand# 实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand# 实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand# 实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2  *  * myCommand# 实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand# 实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart# 实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart# 实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart# 实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart# 实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart# 实例11:每一小时重启smb
* */1 * * * /etc/init.d/smb restart# 实例12:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7 * * * /etc/init.d/smb restart

⏹在 crontab 里,@reboot 是一种特殊的时间标记,表示系统启动完成后执行一次

  • 当系统启动(或 cron 服务启动)后,运行一次 script_a.py
  • >> /home/pi/cron.log 2>&1:把标准输出和错误输出都追加写入 /home/pi/cron.log
@reboot /usr/bin/python3 /home/pi/script_a.py >> /home/pi/cron.log 2>&1

⏹常见的特殊时间标记还有

语法含义
@reboot系统启动后运行一次
@yearly每年运行一次(等同于 0 0 1 1 *
@monthly每月运行一次(等同于 0 0 1 * *
@weekly每周运行一次(等同于 0 0 * * 0
@daily每天运行一次(等同于 0 0 * * *
@hourly每小时运行一次(等同于 0 * * * *

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

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

相关文章

企业频繁收到软件律师函?如何彻底解决这一难题

1. 引言:律师函频发,已成信息化管理的“隐形雷区”在工业制造、芯片、航空航天、船舶制造、医疗器械等高要求行业,软件不仅是研发与生产的关键工具,更是企业数据与知识产权安全的“底座”。然而,不少企业却在日常运营中…

在 macOS 上顺利安装 lapsolver

一、什么是 lapsolver? lapsolver 是一个用于求解线性分配问题(Linear Assignment Problem, LAP) 的 Python 库。线性分配问题是运筹学中的经典问题,核心是在两个集合(如“工人”与“任务”)之间找到一组最…

宋红康 JVM 笔记 Day02|JVM的架构模型、生命周期、发展历程

一、今日视频区间 P13-P25 二、一句话总结 JVM的架构模型;JVM的生命周期;JVM发展历程; 三、关键图/命令 3.1 JVM的架构模型Java程序对.class字节码文件进行反编译操作:在idea中先运行需要反编译的代码,找到对应的字节码…

Linux新手上路 | 在Ubuntu上Pluma文本编辑器的安装与基本使用

Linux新手上路 | 在Ubuntu上Pluma文本编辑器的安装与基本使用一、Pluma工具介绍1.1 Pluma 工具概述1.2 主要功能1.3 适用场景二、安装Pluma2.1 安装方法2.2 启动Pluma工具三、汉化方法3.1 安装汉化包3.2 设置系统语言3.3 重新打开Pluma四、基本使用方法4.1 编写文本内容4.2 关键…

React 揭秘:从新手到高手的进阶之路

目录 React:前端开发新宠​ React 初相识​ 什么是 React​ React 的核心特性​ 1.组件化开发 2.虚拟 DOM 与 Diff 算法 单向数据流 搭建 React 开发环境 环境准备​ 创建 React 项目 项目结构解析 React 基础语法与核心概念 JSX 语法​ 基本语法规则…

八股文小记 Servlet 过滤器-Spring MVC 拦截器-Spring AOP 拦截器区别

您对执行机制的洞察非常准确!让我们深入分析这三种组件的调用机制及其与 AOP 节点的关系: 一、执行机制的本质区别组件调用机制实现原理Servlet 过滤器递归调用通过 FilterChain.doFilter() 显式递归调用下一个节点Spring MVC 拦截器遍历调用由 HandlerE…

qml 实现数值键盘

import QtQuick 2.0import QtQuick.Layouts 1.12 import"../pad" // PasswordKeyboard.qml import QtQuick 2.12ColumnLayout {id: keyboardspacing: 8// 键盘标题Text {text: "安全输入"font.pixelSize: 16color: "#666"Layout.alignment: Qt.A…

PID控制算法

文章目录引言一、基本原理1.1.简介1.2.开环与闭环1.3.PID 的公式1.3.1.比例项(Proportional)1.3.2.积分项(Integral)1.3.3.微分项(Differential)1.4.连续形式与离散形式的 PID 公式1.4.1.连续形式1.4.2.离散…

MyBatis 动态数据源切换在 Spring Boot 环境下的实现方案

第一章 需求背景与技术选型1.1 多数据源场景概述在大型企业级应用中,单一数据库往往无法满足高并发和多业务线的需求,因此需要引入 多数据源 的架构设计。常见的多数据源场景包括:读写分离、多租户、分库分表以及数据源负载均衡等。读写分离&…

PCA降维理论详解

文章目录一、什么是PCA?二、为什么需要降维?三、PCA的数学原理与详细推导视角一:最大化投影方差(Maximizing Variance)视角二:最小化重构误差(Minimizing Reconstruction Error)四、…

Android RxJava变换操作符详解

RxJava作为响应式编程在Android开发中的利器,其强大的变换操作符能够帮助我们优雅地处理数据流。本文将深入讲解RxJava中最常用的变换操作符及其实际应用场景。一、RxJava变换操作符概述变换操作符(Transformation Operators)用于对Observable发射的数据序列进行变换…

开源数据发现平台:Amundsen 快速上手指南

Amundsen 是一个数据发现和元数据引擎,旨在提高数据分析师、数据科学家和工程师与数据交互时的生产力。目前,它通过索引数据资源(表格、仪表板、数据流等)并基于使用模式(例如,查询频率高的表格会优先于查询…

【密码学实战】国密SM2算法介绍及加解密/签名代码实现示例

引言 在信息安全领域,密码算法是数据保护的核心基石。2010 年,中国国家密码管理局发布了 SM2 椭圆曲线公钥密码算法,作为国产密码标准的核心成员,它凭借高效安全的特性,逐步替代 RSA 等国际算法,广泛应用于…

QT开发中如何加载第三方dll文件

文章目录🔧 一、隐式加载(静态链接)操作步骤:⚙️ 二、显式加载(动态链接,推荐使用QLibrary)操作步骤:💻 三、直接调用Windows API(仅Windows)⚠️…

后端学习资料 持续更新中

数据库: 该网址包含:图解MySql, 看明白谁也问不倒你~ 图解计算机网络、操作系统、计算机组成、MySQL、Redis,让天下没有难懂的八股文!https://xiaolincoding.com/

《嵌入式Linux应用编程(六):并发编程基础:多进程exec函数族及多线程基础》

一、exec函数族在一个进程里面执行另一个文件本质&#xff1a;将文本区的指令代码替换成exec要执行的指令#include <unistd.h>参数&#xff1a;path:要执行的可执行文件的路径和名称arg:执行该可执行文件时需要传递的参数NULL&#xff1a;参数传递结束标志 返回值&#x…

【121页PPT】智慧方案智慧综合体智能化设计方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808859/91654007 资料解读&#xff1a;【121页PPT】智慧方案智慧综合体智能化设计方案 详细资料请看本解读文章的最后内容 一、项目概述与智能化总…

Linux网络基础(一)

目录 计算机网络背景 网络发展 初识 "协议" 网络协议初识 协议分层 软件分层的好处 打电话例子 OSI七层模型 TCP/IP五层(或四层)模型 参考资料 再识协议 为什么要有 TCP/IP 协议&#xff1f; 什么是 TCP/IP 协议&#xff1f; TCP/IP 协议与操作系统的关系(宏观上&…

MySQL多表查询案例

多表查询本文介绍了多表查询中的表关系概念和操作方法。主要内容包括&#xff1a;1.三种表关系类型&#xff08;一对多、多对多、一对一&#xff09;及其实现方式&#xff1b;2.多表查询的四种连接方式&#xff08;内连接、左外连接、右外连接、自连接&#xff09;及语法&#…

Dify 从入门到精通(第 36/100 篇):Dify 的插件生态扩展

Dify 从入门到精通&#xff08;第 36/100 篇&#xff09;&#xff1a;Dify 的插件生态扩展 Dify 入门到精通系列文章目录 第一篇《Dify 究竟是什么&#xff1f;真能开启低代码 AI 应用开发的未来&#xff1f;》介绍了 Dify 的定位与优势第二篇《Dify 的核心组件&#xff1a;从…