cron 是許多類 Unix 操作系統中都自帶的用來調度定時任務的工具,定時任務的配置是寫在 crontab 文件中的,但是 crontab 文件不允許直接編輯,一般都是通過命令 crontab -e 來導入配置。配置文件中的每一行定義了一個定時任務,格式如下:
分鍾 小時 天 月份 星期 命令
比如,有個需要每天凌晨 2 點執行的任務 /home/user/task.sh
,那么可以如下配置:
0 2 * * * /home/user/task.sh > /home/user/log 2>&1
注意腳本的路徑要寫全。
這里一個常見的問題是自己手動在終端執行 /home/user/task.sh
可以成功,但是 cron 定時調度執行的時候卻失敗了,大部分情況是由於 cron 執行時環境變量跟我們在終端執行時的環境變量不同導致的。解決問題的辦法有很多,本文要介紹的是用 source ~/.bashrc
(假設用戶需要用的環境變量都定義在 ~/.bashrc
中)。
先直接給出方案,分如下兩步:
- crontab -e 進行配置的時候在前面加上如下配置
SHELL = /bin/bash # 指定 shell 為 bash
- 在
/home/user/task.sh
腳本中加入如下命令
set -i
source ~/.bashrc
第一步指定 shell 為 bash,因為大多數情況下 cron 默認的 shell 為 sh,而 ~/.bashrc
中的一些命令是 sh 不支持的,所以需要將 shell 設置為 bash。
第二步執行 source ~/.bashrc
很好理解,就是讓 ~/.bashrc
中配置的環境變量生效。前面的 set -i
是設置用交互的方式執行命令,因為在 ~/.bashrc
的開頭有一段腳本為
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
說明在非交互式的環境下,不會執行 ~/.bashrc
中的任何命令。
以上介紹了如何在 crontab 中讓 source ~/.bashrc
生效,主要目的是解決 cron 調度定時任務時由於環境變量導致的問題。