Linux crontab定時任務

參考資料

  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;從…