如何在 crontab 中讓 source ~/.bashrc 生效


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 中)。

先直接給出方案,分如下兩步:

  1. crontab -e 進行配置的時候在前面加上如下配置
SHELL = /bin/bash # 指定 shell 為 bash
  1. /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 調度定時任務時由於環境變量導致的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM