Orange的運維學習日記–23.Linux計劃任務詳解
文章目錄
- Orange的運維學習日記--23.Linux計劃任務詳解
- 一次性計劃任務
- atd 服務
- at 命令
- 基本語法
- 交互式示例
- 腳本文件示例
- timespec 格式示例
- 查看與管理任務
- 查看當前隊列
- 查看任務詳細內容
- 刪除任務
- 用戶權限控制
- 用戶周期性計劃任務
- 查看任務
- 編輯任務
- 刪除任務
- 管理其他用戶任務
- 從文件導入任務
- 系統周期性計劃任務
- /etc/crontab
- /etc/cron.d
- /etc/anacrontab
一次性計劃任務
一次性計劃任務用于在未來某個時間點執行單個命令或腳本
atd 服務
Linux 系統通過 atd 后臺進程提供一次性計劃任務功能
安裝 at 軟件包
yum install at
啟用 atd 服務并設置開機啟動
systemctl enable --now atd
systemctl status atd
at 命令
at 命令從標準輸入讀取要執行的命令
基本語法
at <timespec>
交互式示例
在提示符下輸入命令內容,完成后按 Ctrl+D
at now +5 minutes
echo hello world > /tmp/hello.log
<Ctrl+D>
job 1 at Wed Dec 21 17:09:00 2022
腳本文件示例
cat > myscript.sh << 'EOF'
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.log
EOFat now +5 minutes < myscript.sh
job 2 at Wed Dec 21 17:10:00 2022at now +100 minutes -f myscript.sh
job 3 at Wed Dec 21 18:46:00 2022
timespec 格式示例
- now +5 hours
- teatime tomorrow
- noon +4 days
- 5 pm august 3 2016
詳細定義見 /usr/share/doc/at/timespec
查看與管理任務
查看當前隊列
使用 at -l
或 atq
at -l
1 Wed Dec 21 17:09:00 2022 a root
2 Wed Dec 21 17:10:00 2022 a root
3 Wed Dec 21 18:46:00 2022 a root
atd 提供 a–z 共 26 個隊列,字母越靠后優先級越低
指定隊列使用 -q
at -q b now +5 minutes < myscript.sh
job 4 at Wed Dec 21 17:11:00 2022at -l -q b
4 Wed Dec 21 17:11:00 2022 b root
查看任務詳細內容
使用 at -c 作業號
at -c 3
...
${SHELL:-/bin/sh} << 'marcinDELIMITER4bf95eea'
#!/bin/bash
date >> /tmp/myscript.log
echo hello myscript >> /tmp/myscript.logmarcinDELIMITER4bf95eea
刪除任務
使用 atrm 作業號
或 at -d 作業號
atrm 3
用戶權限控制
/etc/at.allow
與 /etc/at.deny
管理用戶訪問 atd 服務
- 存在
/etc/at.allow
時,僅允許文件中列出的用戶使用 at - 不存在
/etc/at.allow
時,禁止/etc/at.deny
中列出的用戶使用 at
用戶周期性計劃任務
周期性任務通過 crond 后臺進程執行,使用 crontab
命令管理
如果未重定向 stdout 和 stderr,crond 會將輸出通過郵件發送給作業所有者
查看任務
crontab -l
編輯任務
crontab -e
編輯文件支持
- 環境變量聲明(name=value),常見變量有 SHELL、MAILTO、PATH
- 空行和
#
注釋 - 每行定義一個任務,按六列順序排列
1 分鐘
2 小時
3 日
4 月
5 星期幾
6 要執行的命令
字段格式
*
表示任意x-y
表示范圍x,y
表示列表,可混合范圍*/n
表示步長間隔- 月份和星期支持三字母縮寫(Jan、Feb…Mon、Tue…)
示例
# 每年 2 月 2 日 9:00 執行備份
0 9 2 2 * /usr/local/bin/yearly_backup# 七月每周五 9:00-16:00 每 5 分鐘發送 Chime
*/5 9-16 * Jul Fri echo "Chime"# 工作日 23:58 運行日報腳本
58 23 * * 1-5 /usr/local/bin/daily_report# 工作日 9:00 發送 Checkingin 郵件
0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi boss just checking in
示例操作
export EDITOR=vim
crontab -e
*/2 2,3-23 * * * date >> /tmp/date.logtail -f /tmp/date.log
2022年12月21日星期三21:02:01CST
2022年12月21日星期三21:04:01CST
刪除任務
crontab -r
管理其他用戶任務
root 用戶可使用 -u
參數
crontab -u laoma -l
crontab -u laoma -r
從文件導入任務
crontab mycron
系統周期性計劃任務
系統管理員可在多處定義周期性作業,crond 會統一讀取
讀取順序
/etc/crontab
/etc/cron.d/
目錄內所有文件/etc/anacrontab
/etc/crontab
該文件格式與用戶 crontab 類似,多一個用戶字段指定執行賬戶
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root# .---------------- 分鐘 (0-59)
# | .------------- 小時 (0-23)
# | | .---------- 日 (1-31)
# | | | .------- 月 (1-12 或 Jan-Dec)
# | | | | .---- 星期幾 (0-7 或 Sun-Sat)
# | | | | |
# * * * * * 用戶 命令
01 4 * * * root /usr/local/bin/system_daily_job
/etc/cron.d
該目錄用于存放自定義系統級 crontab 文件,避免 /etc/crontab
被更新覆蓋
示例 /etc/cron.d/0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
run-parts
會按文件名排序依次執行 /etc/cron.hourly
下的所有腳本
/etc/anacrontab
anacron 確保在系統關機后仍能執行重要任務,anacrontab 同樣由 crond 處理
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45
START_HOURS_RANGE=3-22# period(天) delay(分鐘) job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
字段說明
- period 定義周期天數,支持整數或宏(@daily、@weekly、@monthly)
- delay 定義首次執行前的延遲分鐘數
- job-identifier 對應
/var/spool/anacron
中的狀態文件名 - command 要執行的命令
anacron 在系統啟動后根據狀態記錄執行錯過的任務