Linux 定時任務crontab

在使用Linux時候,常常須要執行定時任務,使用crontab編寫一些定時腳本。在這裏記錄下來,方便之後回憶。php

爲了方便後來進行使用, 在網上摘抄以下:java

 

crond和crontablinux

cron是linux提供的一種服務器,用於按期執行shell命令。主要由兩部分組成shell

  • crond:cron服務的守護進程,用於按期調度
  • crontab:cron提供的UI,用於編輯調度計劃

crontab的使用方法,你們能夠man一下,以下圖:apache

主要有三個選項:vim

  • 「-e」編輯:與vim類是,可是在保存退出時,他會幫你檢查任務語法
  • 「-l」列舉全部任務;
  • 「-r」刪除全部任務;

方法1:windows

使用命令 crontab -e 而後直接編輯定時腳本。數組

這樣執行之後,屬於用戶自定義的,會被寫到 /var/spool/cron 目錄下,生成一個和用戶名一致的文件,文件內容就是咱們編輯的定時腳本。tomcat

方法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」命令,能夠查看定時任務執行的日誌

 

  1. 若是日誌中提示:

    /bin/sh^M: bad interpreter: No such file or directory

     

    分析:這是不一樣系統編碼格式引發的:在windows系統中編輯的.sh文件可能有不可見字符,因此在Linux系統下執行會報以上異常信息。

    解決:(UltraEdit):File-->Conversions-->DOS->UNIX便可。

     

    這個問題但是讓我鬱悶了很久哦~~~

  2. 7

    另外補充一點,要注意定時執行的腳本文件的權限。

    修改爲777最保險了!!

     

    設置自動啓動tomcat

    1. 下面我來介紹怎麼在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

       

    2.  

      添加完畢以後,給其增長可執行權限:chmod +x /etc/init.d/tomcat.

    3.  

      以後就是將這個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文件。

    4. 6

      接下來就是把這個腳本設置成系統啓動時自動執行,系統關閉時自動中止,使用以下命令:chkconfig ——add tomcat。若是chkconfig沒有安裝,則使用apt-get 或者yum之類的程序進行安裝,通常服務器版本的Linux都已經自帶了。

    5. 7

      最後,就是reboot重啓系統了。重啓以後就會發現,你的Tomcat已經成功運行了

相關文章
相關標籤/搜索