個人需要備份博客數據,決定使用 CentOS 的定時任務,正好將設置定時任務的過程寫一下。
本文是基於 CentOS 7,其他 Linux 發行版可能略有不同。
crontab 適用場景
crontab 用於提交和管理執行週期性的任務。
例如你需要在每天凌晨 1 點重啟服務器,那麼 crontab 可以很方便的幫你執行重啟操作。
再例如,你要每隔 5 分鐘檢查某個服務是否在運行,也可以使用 crontab 來實現。
crontab 使用
1、安裝 crontab
一般 CentOS 會默認安裝了 crontab,執行下面命令,查看是否安裝:
<code>rpm -qa | grep crontab/<code>
如果查詢結果類似於下面,說明已安裝:
<code>crontabs-1.11-6.20121102git.el7.noarch/<code>
如果結果為空,說明沒有安裝,執行下面命令進行安裝即可:
<code>yum install -y crontabs/<code>
2、crontab 常用命令
查看 crontab 運行狀態:
<code>systemctl status crond/<code>
如果顯示結果為 Active: active (running) 則表示運行中,Active: inactive (dead) 表示未運行。
如果 crontab 未運行,可以通過下面命令設置開機自啟和啟動。
設置 crontab 開機自啟:
<code>systemctl enable crond/<code>
啟動 crontab:
<code>systemctl start crond/<code>
查看當前用戶的定時任務:
<code>crontab -l/<code>
3、設置定時任務
這裡我們以一個「每天晚上定時將指定文件夾打包成壓縮包」的任務為例,說明設置定時任務的步驟。
首先,在 root 目錄下創建一個 test 文件夾:
<code>mkdir test/<code>
然後在 root 下創建一個腳本 test.sh:
<code>vim /root/test.sh/<code>
按 i 進入編輯狀態,粘貼下面內容:
<code>#! /bin/bash
tar -zcvf test.tar /root/test/<code>
按 Esc 鍵,再輸入 :wq 保存文件。
執行下面命令即可編輯當前用戶的定時任務:
<code>crontab -e/<code>
假如我想在每天 19:00 的時候壓縮 test 文件夾,那麼可以按下 i 進入編輯狀態,粘貼下面內容:
<code>0 19 * * * bash /root/test.sh/<code>
按 Esc 鍵,再輸入 :wq 保存,當然你也可以修改為臨近的時間,測試是否生效。
通過 crontab -l 可查看到已保存的定時任務:
<code>0 19 * * * bash /root/test.sh/<code>
定時任務參數說明:
<code># .---------------- 分鐘,取值範圍為 0-59
# | .------------- 小時,取值範圍為 0-23
# | | .---------- 日,取值範圍為 1-31
# | | | .------- 月,取值範圍為 1-12
# | | | | .---- 星期,取值範圍為 0-7,0 和 7 都表示星期日
# | | | | | .-- 要執行的命令
# | | | | | |
0 19 * * * bash /root/test.sh/<code>
參數中的添加了 bash 字段,是因為我在實際使用的過程中,發現定時任務不執行,搜索之後發現,需要在執行的命令前添加 bash 或者 /etc/profile;/bin/sh。
到達指定時間之後,查看 /root 目錄下是否已經有了 test.tar 壓縮包,如果有說明定時任務執行成功;如果沒有,則說明 crontab 沒有執行。
4、crontab 不執行的原因
- 檢查 crontab 服務是否正常
- 檢查腳本路徑是否絕對路徑
- 檢查腳本路徑前是否添加了 bash 或 /etc/profile;/bin/sh
如果以上都沒問題,那就要通過日誌查找問題所在了。
實際使用
我自己使用 crontab 是為了備份博客的數據到 gitee,簡單說下步驟。
- 將數據所在的目錄初始化並推送到遠程倉庫
- 新建自動推送更新的腳本 git.sh
<code>#! /bin/bash
t=$(date +%Y%m%d%H%M%S)
cd /root/halo
git pull
git add .
git commit -m $t
git push/<code>
- crontab -e 設置定時任務
<code>0 23 * * * bash /root/halo/git.sh/<code>
之所以備份到 gitee 而不是 GitHub,當然是因為 gitee 訪問穩定且快,這裡需要注意,要通過 SSH 方式推送。
以上就是我在使用 crontab 過程的總結,歡迎溝通交流。
閱讀更多 掘墓人的小鏟子 的文章