在使用Linux時候,經常需要執行定時任務,使用crontab編寫一些定時腳本。在這里記錄下來,方便以后回憶。
為了方便后來進行使用, 在網上摘抄如下:
crond和crontab
cron是linux提供的一種服務器,用於定期執行shell命令。主要由兩部分組成
- crond:cron服務的守護進程,用於定期調度
- crontab:cron提供的UI,用於編輯調度計划
crontab的使用方法,大家可以man一下,如下圖:
主要有三個選項:
- “-e”編輯:與vim類是,但是在保存退出時,他會幫你檢查任務語法;
- “-l”列舉所有任務;
- “-r”刪除所有任務;
方法1:
使用命令 crontab -e 然后直接編輯定時腳本。
這樣執行以后,屬於用戶自定義的,會被寫到 /var/spool/cron 目錄下,生成一個和用戶名一致的文件,文件內容就是我們編輯的定時腳本。
方法2:
使用命令 vi /etc/crontab 編輯定時腳本。
(系統級的)做系統級配置我們會直接配置 /etc/crontab
(用戶級的)一般還是建議大家使用 crontab -e ,這樣系統也會幫着檢查我們配置的腳本語法。
基本語法
cron的語法很簡單,如下:
【調度頻率】 shell命令
看個例子:
可以看出,前面分別是分鍾,小時,天,月和周,最后是shell命令。cron調度的最小頻率為1分鍾。上面這段調度的意思是:“每天10點30分,執行/some/path/do_something.sh”。
以上命令中每一塊的具體意義如下:
意義 |
分鍾 |
小時 |
天 |
月份 |
周 |
命令 |
范圍 |
0-59 |
0-23 |
1-31 |
1-12 |
0-7 |
shell命令 |
P.S.: “周”這一欄中0和7都代表周日
P.S.: 每個月的最后一日無法由crontab直接支持,需要通過腳本判斷,參見這里。
P.S.: 命令最好是絕對路徑
還有一些輔助的符號,可以借助他們寫出更靈活的調度
特殊字符 |
代表意義 |
*(星號) |
代表任何時候都接受,比如上面的例子,day,month和week為“*”,表示無論那個月,那一天,周幾,都在10點30分執行命令。 |
,(逗號) |
並列時間。舉個例子: * 3,6,9,12 * * * command 上面的意思是在3點,6點,9點或12點,執行命令。 |
-(減號) |
連續區間。舉個例子: * 9-17 * * * command 上面的意思是從9點到17點,每一分鍾都要執行這個任務 |
/n(斜線) |
n代表數組,表示每隔n個單位之間,比如每隔5分鍾,可以寫成下面 */5 * * * * command |
一些例子
- 59 23 27 11 * mail benben < /home/dmtsai/lover.txt // 每一年11月27日23分59 秒發一封情書給benben
- 0 17 * * 5 mail all_members < weekily_report_notify // 每周五 下午5點整,提醒所有組員發周報
系統級的crontab
系統級的crontab只有root權限有權編輯,該crontab是一個文件,位置為/etc/crontab,
系統級別的crontab的語法與上面稍微不一樣,需要在頻率和命令之間添加命令執行者,如下所示,並且可以添加一些全局變量,在調度中使用:
詳細的系統級調度可以參見這里。
這里需要強調/etx目錄下幾個與cron有關的目錄和文件,如下所示
- cron.d:目錄,此目錄下以及子目錄中所有符合調度語法的文件都會被執行
- cron.deny與cron.allow:此文件記錄拒絕和允許執行的帳號,cron.allow的優先級大於cron.deny,建議一般只留一個就可以
- cron.daily/hourly/monthly/weekly:這些目錄里面全部都是腳本,分別在指定的時間里面執行。
絕對路徑
雖然crontab執行,可以理解為手動執行的定時觸發。但是,執行過程中的路徑仍然有所區別,很多情況下手動執行成功,但是crontab不成功,多半是由於采用了相對路徑。所以,使用crontab時,盡量采用絕對路徑。結果一些實踐,總結了一條經驗:如果命令手動可以執行成功,但是crontab失敗,那么就需要重點關注相關路徑問題。
參考資料
比如 定時運行tomcat
編寫tomcat_shutdown.sh:
#!/bin/sh
export JAVA_HOME=/home/oracle/jdk1.7.0_67/
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
echo "========begin stop the tomcat========"
'/home/oracle/apache-tomcat-7.0.29/bin/shutdown.sh'
編寫tomcat_startup.sh:
#!/bin/sh
export JAVA_HOME=/home/oracle/jdk1.7.0_67/
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
echo "========begin start the tomcat========"
'/home/oracle/apache-tomcat-7.0.29/bin/startup.sh'
在linux系統終端中,輸入命令“crontab -e”:
在vi操作界面,輸入:
01 03 * * * /home/oracle/auto_exec/tomcat_shutdown.sh
03 03 * * * /home/oracle/auto_exec/tomcat_startup.sh
使用“crontab -l”命令,可以查看定時任務的設置情況。
使用“tail /var/spool/mail/xxxx”命令,可以查看定時任務執行的日志
-
如果日志中提示:
/bin/sh^M: bad interpreter: No such file or directory
分析:這是不同系統編碼格式引起的:在windows系統中編輯的.sh文件可能有不可見字符,所以在Linux系統下執行會報以上異常信息。
解決:(UltraEdit):File-->Conversions-->DOS->UNIX即可。
這個問題可是讓我郁悶了好久哦~~~
-
另外補充一點,要注意定時執行的腳本文件的權限。
修改成777最保險了!!
設置自動啟動tomcat
-
下面我來介紹怎么在linux系統下設置tomcat自啟動。我們都知道,在linux系統下,設置某個服務自啟動的話,需要在/etc/rcX.d下掛載,還要在/etc/init.d/下寫啟動腳本的。
第一補:我們在/etc/init.d/下新建一個文件tomcat(需要在root權限下操作)
vi /etc/init.d/tomcat
寫入如下代碼:
# tomcat自啟動腳本
#!/bin/sh
# chkconfig: 345 99 10
# description: Auto-starts tomcat
# /etc/init.d/tomcatd
# Tomcat auto-start
# Source function library.
#. /etc/init.d/functions
# source networking configuration.
#. /etc/sysconfig/network
RETVAL=0
export JDK_HOME=/usr/java/jdk1.7.0_45 (請填寫真實的JDK目錄)
export CATALINA_HOME=/home/ldatum/usr/apache-tomcat-7.0.10(請填寫真實的tomcat目錄)
export CATALINA_BASE=/home/ldatum/usr/apache-tomcat-7.0.10(請填寫真實的tomcat目錄)
start()
{
if [ -f $CATALINA_HOME/bin/startup.sh ];
then
echo $"Starting Tomcat"
$CATALINA_HOME/bin/startup.sh
RETVAL=$?
echo " OK"
return $RETVAL
fi
}
stop()
{
if [ -f $CATALINA_HOME/bin/shutdown.sh ];
then
echo $"Stopping Tomcat"
$CATALINA_HOME/bin/shutdown.sh
RETVAL=$?
sleep 1
ps -fwwu tomcat | grep apache-tomcat|grep -v grep | grep -v PID | awk '{print $2}'|xargs kill -9
echo " OK"
# [ $RETVAL -eq 0 ] && rm -f /var/lock/...
return $RETVAL
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
echo $"Restaring Tomcat"
$0 stop
sleep 1
$0 start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
-
添加完畢之后,給其增加可執行權限:chmod +x /etc/init.d/tomcat.
-
之后就是將這個shell文件的link連到/etc/rc2.d/目錄下。linux的/etc/rcX.d/目錄中的數字代表開機啟動時不同的run level,也就是啟動的順序,Ubuntu9.10下有0-5六個level,不能隨便連到其他目錄下,可能在那個目錄中的程序啟動時Tomcat所需要的一些庫尚未被加載,用ln命令將tomcat的鏈接鏈過去:ln -s /etc/init.d/tomcat /etc/rc2.d/S16Tomcat。rcX.d目錄下的命名規則是很有講究的,更具不同需要可能是S開頭,也可能是K開頭,之后的數字代表他們的啟動順序,詳細看各自目錄下的Readme文件。
-
接下來就是把這個腳本設置成系統啟動時自動執行,系統關閉時自動停止,使用如下命令:chkconfig ——add tomcat。如果chkconfig沒有安裝,則使用apt-get 或者yum之類的程序進行安裝,一般服務器版本的Linux都已經自帶了。
-
最后,就是reboot重啟系統了。重啟之后就會發現,你的Tomcat已經成功運行了
-