常常用crontab -e 編輯定時任務, 某次手賤 命令敲成了 crontab -r, 悲催了vim
usage: crontab [-u user] file crontab [ -u user ] [ -i ] { -e | -l | -r } (default operation is replace, per 1003.2) -e (edit user's crontab) -l (list user's crontab) -r (delete user's crontab) -i (prompt before deleting user's crontab)
而後本能驅使我, 趕忙谷歌找解決方案, 查到的所有都是 經過 /var/log/cron* 文件恢復,但是我沒找到有這個文件啊bash
就在我心灰意冷, 打算憑記憶寫上幾個任務, 其餘的慢慢找人恢復的時候, 我靈機一動, 可能日誌文件沒在這個目錄呢spa
因而, 我全局搜索了一下 和 "cron" 有關的文件, 命令行
sudo find / --name "*cron*"
找到了一大堆, 其中有個文件 極其扎眼: 「/tmp/crontab.VgsSIK/crontab」日誌
我首先查看了一下文件日期, 是15天以前的文件, 顫抖的雙手,敲下來vim 命令, 哇, 個人世界又恢復了顏色, 正是備份的crontab文件。雖然是15天以前的文件, 也足夠讓我起死回生了code
>>>>>>>>>>>>>>>>>>>>>>>>blog
上面是個人故事, 那下面說說若是沒有備份, 有日誌文件, 應該怎麼作呢
根據日誌文件恢復:crontab
cat /var/log/cron* | grep -i "某個用戶" | grep "CMD" | awk -F '(' '{print $3}' | awk -F ')' '{print $1}' | sort -u > crontab_tmp
解釋: grep -i 「某個用戶」 :是爲了過濾其餘用戶的信息 grep "CMD":是須要過濾非命令行 awk -F '(' '{print $3}':是以’(‘爲分隔符,提取第三個元素。這裏結果爲「/home/scripts/check_alive.sh)」 awk -F ')' '{print $1}':是以’)’爲分隔符,提取第一個元素。這裏結果爲「/home/scripts/check_alive.sh」 這時,咱們已經提取到本身所須要的命令了,但因爲crontab定時觸發,會有大量重複。後面須要進行去重 sort > cmd_tmp:去重後輸出至cmd_tmp文件 後續根據提取出來的命令再去 /var/log/cron文件中確認一下時間間隔,按照指定的方式恢復至/var/spool/cron/
>>>>>>>>>>>>>>>>>>>>>>> 定時備份crontab 腳本
從 這篇文章粘貼過來的, 感謝一下原做者
ip
說明⚠️:天天早上七點對crontab 進行備份 ,同時刪除7天前的數據get
腳本以下:
backup_crontab.sh #!/usr/bin/env bash BACKUP_DIRECTORY="${HOME}/crontab_backup" if [ ! -e "${BACKUP_DIRECTORY}" ]; then mkdir -p ${BACKUP_DIRECTORY} fi crontab -l > ${BACKUP_DIRECTORY}/$(date '+%Y%m%d').txt find ${HOME}/crontab_backup -mtime +7 -name '*.txt' -exec rm -rf {} \;
說明:
上面腳本中的" find ${HOME}/crontab_backup -mtime +7 -name '*.txt' -exec rm -rf {} \; ",也能夠替換成" find ${HOME}/crontab_backup -mtime +7 -name '*.txt' | xargs rm -rf "。
把上面的腳本放在 crontab 定時任務中執行:
## backup_crontab 0 7 * * * cd /data/siterecoffline && sh backup_crontab.sh