歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 在Linux下利用crond實現一個定時任務並完成一個守護(精靈)進程

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

日期:2017/3/3 12:58:26   编辑:Linux技術
一、利用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命令。 例如:每隔一分鐘:


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



注意單純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表示列出與作業控制相關的信息。



凡是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信號
例:











運行結果:



本文出自 “流蘇” 博客,請務必保留此出處http://ab6107.blog.51cto.com/10538332/1771922
Copyright © Linux教程網 All Rights Reserved