Software engineering notes

Linux Crontab

[1] 建立/var/www/test/hello.sh 檔:

#!/bin/bash
echo "Hello World"

[2] 假使要每一分鐘執行一次hello.sh

執行:

$ crontab -e

會進入編輯器,輸入:

# 每分鐘執行一次
*/1 * * * * echo "job every minute" >> /tmp/tz

# 每 0:15, 12:15 分執行一次
15 0,12 * * * /bin/bash -l -c 'cd /var/www/web_app && RAILS_ENV=development bundle exec rake schedule:check_something --silent'

# 星期一~五  9am~18pm
00 09-18 * * 1-5 /home/ramesh/bin/check-db-status

格式 : 分(0-59), 時(0-23) ,日(1-31) ,月(1-12) ,週(0-6), Command

[3] 其他指令 :

執行排程並不會影響到你目前工作視窗,因為它是背景執行的,所以每隔一分鐘, 並不會看到 “Hello World” 字串出現在畫面上,但它會在每一次執行時紀錄在log裡

編輯 crontab 的工作內容,若要移除某些排程,直接刪除就可以了

crontab -e

查詢 crontab 的工作內容

crontab -l

移除所有的 crontab 的工作內容

crontab -r

查看 crontab

grep CRON /var/log/syslog

運作指令:

service crond start         # 啟動服務
service crond stop          # 關閉服務
service crond restart       # 重啟服務
service crond reload        # 重新載入配置

或
/etc/init.d/cron restart

Set Timezone

注意!! : 如果修改完主機的 timezone 卻沒有重新啟動 cron, 那麼 cron 仍然還會是吃舊的 timezone

參考此篇修改 timezone後要記得 restart : sudo service crond restart

另一種方式設定排程

除了crontab -e可以設定每日排程外,也有另一種方法執行排程

系統預設提供這些時間點的排程,在etc/的cron.daily/ cron.hourly/ cron.monthly/ cron.weekly/

只需要把script丟進你想要的時間的資料夾裡,系統時間到就會自動執行

而各時段執行排程的時間點設定在/etc/crontab

# m h dom mon dow user  command
=====================================

# /etc/cron.hourly,目錄下的腳本會每個小時讓執行一次,在每小時的17分鐘時運行;
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly

# /etc/cron.daily,目錄下的腳本會每天讓執行一次,在每天的6點25分時運行;
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

#  /etc/cron.weekly,目錄下的腳本會每週讓執行一次,在每週第七天的6點47分時運行;
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

# /etc/cron.mouthly,目錄下的腳本會每月讓執行一次,在每月1號的6點52分時運行;
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

run cron.daily

/etc/cron.daily 底下至少要有r-x權限

sudo chmod 755 your_cron

測試看哪一個沒有執行

run-parts --test --report /etc/cron.daily

強制重啟cron:

ps aux | grep cron
root     15082  0.0  0.0  18708  1068 ?        Ss   13:23   0:00 cron

kill 15082
ps aux | grep cron # 若已經自動跑起來, 就不需要下面的步驟
/usr/sbin/cron &

另一種方法

/etc/cron.d/ 底下建立新檔案

每天 01:05 刪除超過 15 天以上的 log, logs/以下的子資料夾裡的檔案也會清

5 1 * * * ec2-user /usr/bin/find /home/apps/php-api/app/logs/* -mtime +15 -exec rm {} \;

不用重啟 cron 就會生效了

ref: