在Linux下利用crond實現一個定時任務並完成一個守護(精靈)進程

一、利用crond實現一個定時任務

        在LINUX中,週期執行的任務一般由cron這個守護進程來處理[ps -ef|grep cron]。cron讀取一個或多個配置文件,這些配置文件中包含了命令行及其調用時間。
cron的配置文件稱爲“crontab”,是“cron table”的簡寫。 

crontab支持兩種狀態:

a.直接編寫計劃任務;

b.使用目錄的方式,放在目錄裏面的都會定時執行,定時目錄可在/etc/crontab中設定。

爲當前用戶創建cron服務

1.  鍵入 crontab  -e 編輯crontab服務文件

cron文件語法:

      分       小時     日        月        星期      命令

      0-59   0-23    1-31    1-12      0-6     command     (取值範圍,0表示週日一般一行對應一個任務)

     記住幾個特殊符號的含義:

         “*”代表取值範圍內的數字

         “/”代表”每”,

         “-”代表從某個數字到某個數字,

         “,”分開幾個離散的數字

      例如 文件內容如下:

      */1 * * * *echo "it's dinner time">> /home/admin/abc.txt

     */2 * * * * /bin/sh /home/admin/jiaoben/deleteFile.sh 

      /bin/sh /home/admin/jiaoben/buy/deleteFile.sh 這一字段可以設定你要執行的腳本,這裏

要注意一下bin/sh 是指運行腳本的命令 ,後面一段時指腳本存放的路徑。

2. 查看該用戶下的crontab服務是否創建成功, 用 crontab  -l 命令  

3.cron是一個linux下 的定時執行工具,可以在無需人工干預的情況下運行作業。

  /sbin/service crond start    //啓動服務
  /sbin/service crond stop     //關閉服務
  /sbin/service crond restart  //重啓服務
  /sbin/service crond reload   //重新載入配置
  /sbin/service crond status   //查看服務狀態 

4. 查看服務是否已經運行用 ps -ax | grep cron 

5. crontab命令

      cron服務提供crontab命令來設定cron服務的,以下是這個命令的一些參數與說明:

     crontab -u //設定某個用戶的cron服務,一般root用戶在執行這個命令的時候需要此參數  

  crontab -l //列出某個用戶cron服務的詳細內容

  crontab -r //刪除沒個用戶的cron服務

  crontab -e //編輯某個用戶的cron服務

  比如說root查看自己的cron設置:crontab -u root -l

  再例如,root想刪除fred的cron設置:crontab -u fred -r

  在編輯cron服務時,編輯的內容有一些格式和約定,輸入:crontab -u root -e

  進入vi編輯模式,編輯的內容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

        任務調度的crond常駐命令

        crond 是linux用來定期執行程序的命令。當安裝完成操作系統之後,默認便會啓動此任務調度命

令。crond命令每分鐘會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作.

5、權限問題

crontab權限問題到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在
用法如下: 
1)、如果兩個文件都不存在,則只有root用戶才能使用crontab命令。 
2)、如果cron.allow存在但cron.deny不存在,則只有列在cron.allow文件裏的用戶才能使用crontab命令,如果root用戶也不在裏面,則root用戶也不能使用crontab。 
3)、如果cron.allow不存在, cron.deny存在,則只有列在cron.deny文件裏面的用戶不能使用crontab命令,其它用戶都能使用。 
4)、如果兩個文件都存在,則列在cron.allow文件中而且沒有列在cron.deny中的用戶可以使用crontab,如果兩個文件中都有同一個用戶,
以cron.allow文件裏面是否有該用戶爲準,如果cron.allow中有該用戶,則可以使用crontab命令。

 例如:每隔一分鐘:

wKioL1cxx2zjk_sZAAASF8XZBpM865.jpg

用tail -f abc1.txt監視便會得到如下結果,完成了一個簡單的定時任務:

wKioL1cxx2zhjwjAAAAd1e4BAI0959.jpg

注意單純echo,從屏幕上看不到任何輸出,因爲cron把任何輸出都email到root的信箱了。

6. 任務調度設置文件的寫法

      1) 在命令行輸入: crontab -e 然後添加相應的任務,wq存盤退出。

      2)直接編輯/etc/crontab 文件,即vi /etc/crontab,添加相應的任務

     cron服務每分鐘不僅要讀一次/var/spool/cron內的所有文件,還需要讀一次 /etc/crontab,因此我

們配置這個文件也能運用cron服務做一些事情。用crontab配置是針對某個用戶的,而編

輯/etc/crontab是針對系統的任務。此文件的文件格式是:  

  SHELL=/bin/bash  

  PATH=/sbin:/bin:/usr/sbin:/usr/bin 

  MAILTO=root //如果出現錯誤,或者有數據輸出,數據作爲郵件發給這個帳號  

  HOME=/ //使用者運行的路徑,這裏是根目錄  
  # run-parts  

  01   *   *   *   *     root run-parts /etc/cron.hourly         //每小時執行/etc/cron.hourly內的腳本  

     02   4   *   *   *     root run-parts /etc/cron.daily           //每天執行/etc/cron.daily內的腳本  

       22   4   *   *   0     root run-parts /etc/cron.weekly       //每星期執行 /etc/cron.weekly內的腳本  

      42   4   1   *   *     root run-parts /etc/cron.monthly     //每月去執行/etc/cron.monthly內的腳本  

  注意”run-parts”這個參數了,如果去掉這個參數的話,後面就可以寫要運行的某個腳本名,而

不是文件夾名了


二、守護進程

    守護進程也稱精靈進程(Daemon),是運行在後臺的一種特殊進程。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。守護進程是一種很有用的進程。

Linux的打多數服務器就是用守護進程實現的。如,Internet服務器inetd,Web服務器httpd等。同時,守護進程完成許多系統任務。如,作業規劃進程crond等。

Linux系統啓動時會啓動很多系統服務進程,例如“網絡登錄過程”中的inetd,這些系統服務進程沒有控制終端,不能直接和用戶交互。其它進程都是在用戶登錄或運行程序時創建,在運行結束或用戶註銷時終止,但系統服務進程不受用戶登錄註銷的影響,它們一直在運行着。這種進程有一個名稱叫守護進程(Daemon)。  

我們可以用ps axj命令查看系統中的進程。參數a表示不僅列出當前用戶的進程,也列出所有其他用戶的進程,參數x表示不僅列有控制終端的進程,也列出所有無控制終端的進程,參數j表示列出與作業控制相關的信息。

wKiom1cxyIKjceKxAABkUceku2w687.jpg


凡是TPGID一欄寫着-1的都是沒有控制終端的進程,也就是守護進程。在COMMAND一列[]括起來的名字表內核線程,這些線程在內核裏創建,沒有用戶空間代碼,因此沒有程序文件名和命令行, 通常採用以k開頭的名字,表示Kernel。init進程我們已經很熟悉了,udevd負責維護/dev目錄下的設備文件,acpid負責電源管理,syslogd負責維護/var/log下的日誌文件,可以看出,守護進程通常採用以d結尾的名字,表Daemon。


創建守護進程最關鍵的一步是調用setsid函數創建一個新的Session,併成爲Session Leader。


該函數調用成功時返回新創建的Session的id(其實也就是當前進程的id),出錯返回-1。注意,調用這個函數之前,當前進程不允許是進程組的Leader,否則該函數返回-1。要保證當前進程不是進程組的Leader也很容易,只要先fork再調用setsid就行了。fork創建的子進程和父進程在同一個進程組中,進程組Leader必然是該組的第一個進程,所以子進程不可能是該組的第一個進程,在子進程中調用setsid就不會有問題了。  

成功調用該函數的結果是:

1. 創建一個新的Session,當前進程成爲Session Leader,當前進程的id就是Session的id。

2. 創建一個新的進程組,當前進程成爲進程組的Leader,當前進程的id就是進程組的id。

3. 如果當前進程原本有一個控制終端,則它失去這個控制終端,成爲一個沒有控制終端的進程。所謂失去控制終端是指,原來的控制終端仍然是打開的,仍然可以讀寫,但只是一個普通的打開文件而不是控制終端了。

創建守護進程  

1. 調用umask將文件模式創建屏蔽字設置爲0.

2. 調用fork,父進程退出(exit)。原因:1)如果該守護進程是作爲一條簡單的shell命令啓動的,那麼麼進程終止使得shell認爲該命令已經執行完畢。2)保證子進程不是一個進程組的組長進程。

3. 調用setsid創建一個新會話。setsid會導致:1)調用進程成爲新會話的首進程。 2)調用進程成爲一個進程組的組長進程 。3)調用進程沒有控制終端。(再次fork一次,保證daemon進程,之後不會打開tty設備)

4. 將當前工作目錄更改爲根目錄。

5. 關閉不在需要的文件描述符。

6. 其他:忽略SIGCHLD信號

例:

wKiom1cxyVCTfQR9AACJWQCeEDQ080.jpg

wKioL1cxyi6isV7gAAA87F-nyhY124.jpgwKioL1cxyYSzjTdhAAAcPNlJBz0395.jpg

wKioL1cxyYSjkIgoAAAKcOVqFbM040.jpg

運行結果:

wKiom1cxyKbzffZ3AAAaqT3Aw-c264.jpg





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章