1. 程式人生 > >Linux之————守護程序與crond定時任務

Linux之————守護程序與crond定時任務

一. 守護程序

    守護程序又稱為精靈(Daemon)程序,顧名思義,守護是一直會存在的,它是執行在後臺的一種特殊的程序,獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。比如當Linux系統啟動的時候會啟動一些系統服務程序,因為這些程序沒有控制終端因此不能直接和使用者進行互動,它的生命週期隨系統,而不是像使用者登入或者執行程式才開始啟動的而程序執行完畢或者使用者登出後就終止,這種程序就稱之為守護程序或者精靈程序

    可以在終端下檢視系統中的守護程序,這些程序通常以精靈的單詞Daemon的首字母d結尾:

wKioL1cx3APSbqWKAAAoOHiXxvs283.png

從上面可以看到,大多數程序的程序ID號、程序組ID和會話ID都是同一個ID號,而其控制終端TTY是沒有的,因此,守護程序有如下特點:

  1. 守護程序自成程序組並且自成會話,也就是守護程序所在的程序組和會話中只有自身一個程序;

  2. 守護程序不與終端裝置關聯;

二. 建立守護程序

    我們可以自己利用守護程序的特點建立一個守護程序,而使用到的函式是setsid函式:

wKioL1cx4y2idsKEAABp5COahVg247.png

該函式的引數為空,返回值是pid_t也就是呼叫該函式的程序ID號;

setsid函式呼叫有如下三個特點:

  1. 新創建出一個會話並且呼叫函式程序為會話首程序,會話ID為程序ID;

  2. 新創建出一個程序組並且呼叫函式程序為程序組的組長程序,程序組ID為程序ID;

  3. 若呼叫函式程序和一個控制終端關聯,則失去這個終端,這個終端仍然會存在並且可以讀寫,但只是一個檔案而不再是一個控制終端;

這裡需要強調的是,在呼叫setsid之前必須保證呼叫函式程序不是組長程序

,這樣的話,可以考慮用fork來創建出子程序,讓子程序來呼叫setsid,因為在同一個程序組中子程序之前還有程序,而組長程序是該組的第一個程序,這樣就可以確定子程序不是組長程序了。

建立守護程序一般有如下幾個步驟:

  1. 呼叫umask將檔案模式建立遮蔽字設定為0,以確保党進程想要生成檔案時不受系統許可權的控制;

  2. 呼叫fork創建出子程序,以確保子程序不是組長程序,同時使父程序退出只保留子程序;

  3. 呼叫setsid函式,該函式建立成功會新建一個會話和一個程序組,該程序組ID和會話ID都是子程序的ID,同時使子程序失去其原本連結的控制終端(再次fork,使當前子程序退出,因為當前子程序是話首程序可能之後還會開啟控制終端,而再次fork出的子程序不是話首程序,確保之後不會再次開啟控制終端);

  4. 將當前使用者目錄更改為根目錄,使程序工作目錄穩定;

  5. 關掉不需要的檔案描述符;

  6. 其他(忽略SIGCHILD訊號);

程式設計:

#include <stdio.h>#include <signal.h>#include <unistd.h>#include <stdlib.h>void my_daemon(){    umask(0);//設定檔案建立遮蔽字為0    pid_t pid;    pid = fork();//創建出子程序    if(pid < 0)    {           printf("first fork failed...\n");        perror("fork");    }       else if(pid > 0)//father   父程序退出    {           printf("father process out...pid: %u\n", getpid());        exit(0);    }       //child   子程序    printf("child process...pid: %u\n", getpid());    if((pid = setsid()) < 0)//呼叫setsid函式建立守護程序        perror("setsid");    else        printf("create daemon process success...pid: %u\n", getpid());    if((pid = fork()) < 0)//再次fork並使父程序退出,確保子程序不是話首程序不會再開啟TTY裝置    {           printf("second fork failed...\n");        perror("fork");    }       else if(pid > 0)//father   父程序退出    {           printf("last child as father process out...pid: %u\n", getpid());        exit(1);    }    if(chdir("/") < 0)//將工作目錄更改為根目錄    {        printf("change dir failed...\n");        perror("chdir");    }    printf("signal: %u\n", signal(SIGCHLD, SIG_IGN));    if(close(0) < 0)//關掉標準輸入        printf("close stdin failed...\n");    if(close(2) < 0)//關掉標準輸出        printf("close stderr failed...\n");    if(close(1) < 0)//關掉標準錯誤        printf("close stdout failed...\n");}int main(){    my_daemon();    while(1);    return 0;}

執行程式:

wKioL1c0Fo7TUEukAABaXCGooSI150.png

程式執行結果到“signal:0”輸出就結束了,但這裡並不是死迴圈,因為第一次fork使父程序退出,此時shell認為當前作業已經完成,將把bash放到前臺執行,但這時候daemon程序雖然呼叫setsid失去了控制終端,但還是能夠進行讀寫,因此還是會打印出資訊,只是不再作為一個控制終端了,用jobs命令來檢視後臺也檢視不到,可用下面命令來檢視:

wKiom1c0FbHTc847AAC4GcHZTNQ745.png

檢視結果發現有一個自己寫的daemon程序,可以看到其程序組ID和會話ID就是前面執行程式結果中呼叫setsid函式後來再次fork又退出的程序,而其TTY一項並沒有關聯,因此daemon是一個守護程序。

-------------------------------------------------------------------------------------------

    在上面羅列出的系統的守護程序中,有一個crond的守護程序,這個程序的作用就是定期執行任務或等待處理某些任務,在目錄/etc下就可以檢視有關的檔案:

wKiom1c0Q2fxD3zRAABqsdndTqE037.png

cron.allow裡面存放使用者名稱,用來標識是否允許使用者擁有自己的cron定時任務,一開始是沒有這個檔案的,可以由超級使用者新增;

cron.deny裡面則存放了禁止使用者使用cron守護程序;

開啟crontab檔案:

wKiom1c0RJ2ComVOAAAZ116tzzs965.png

每個使用者都可以有自己的crontab檔案,而檔案內容的格式則如上圖:每一個*號的位置都是時間點,而後面則是定時要執行的任務;

*表示每分鐘(小時、周、月...)都要執行;

*/n表示每隔n分鐘(小時、周...)執行;

t1--t2表示在t1--t2時間段裡都要執行;

t1,t2,t3表示分別在t1,t2,t3時間執行;

crontab -e 可以編輯使用者crontab檔案內容,若沒有指定使用者則為當前使用者;

crontab -l 顯示使用者的crontab檔案內容;

crontab -r 刪除使用者的crontab檔案;

crontab -u 設定某個使用者的cron服務,一般是超級使用者;

另外:

service crond start   啟動cron服務;

service crond stop    停止cron服務;

service crond restart  重啟cron服務;

service crond status  檢視當前cron狀態

使用者的crontab檔案存放在目錄/var/spool/cron下,檔名就是使用者名稱;

比如在root的crontab檔案中寫入命令:

*/1 * * * * echo You should drink some water... >> test.txt

則重新啟動cron服務並用tail -f 來檢視:wKioL1c0S62gHKFKAAAMw513dyI709.png

如上所示,每隔一分鐘就向test.txt檔案追加一句話,這樣就完成了使用者自己的一個定時任務。

《完》

相關推薦

Linux————守護程序crond定時任務

一. 守護程序    守護程序又稱為精靈(Daemon)程序,顧名思義,守護是一直會存在的,它是執行在後臺的一種特殊的程序,獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。比如當Linux系統啟動的時候會啟動一些系統服務程序,因為這些程序沒有控制終端因此不能直

Linux系統守護進程和計劃任務

linux進程和計劃任務 程序和進程的關系*程序·保存在硬盤、光盤等介質中可執行代碼和數據·靜態保存的代碼*進程·在cpu及內存中運行的程序代碼·動態執行的代碼·父、子進程>每個進程可創建以個或者多個進程*PID號·每個進程的唯一標識,通常作為結束進程時使用*進程查詢·ps

Linux crond 定時任務

linux基礎配置文件,一般不需要管這類題目一定要註意陷阱 每兩小時一次* */2 * * * 這樣就錯的00 */2 * * * 這樣才對如果只是某天的話,就確定日如果是每周某天的話,就確定周代碼、配置變更發布流程:個人開發環境——>辦公測試環境——>IDC機房測試環境——>IDC正式環境

老男孩Linux Crond定時任務練習題

Linux運維 Linux入門 Linux基礎 Linux定時任務 系統運維 Linux Crond定時任務練習題Crond是系統中用來定期執行命令或指定程序任務的一種服務或軟件。 嚴格的說,linux系統下的定時任務軟件不少,例如:at、crontab、anacron,其中crontab

linux 守護程序用&結尾的後臺執行程式有什麼區別

預設情況下,程序是在前臺執行的,這時就把shell給佔據了,我們無法進行其它操作。對於那些沒有互動的程序,很多時候,我們希望將其在後臺啟動,可以在啟動引數的時候加一個’&'實現這個目的: [email protected]:~/application/zookeeper

linux系統tomcat應為被定時任務指令碼監控自動部署,伺服器重啟導致同一個tomcat出現很多程序,kill -9殺死又出現等一系列問題解決。

linux系統tomcat應為被定時任務指令碼監控自動部署,伺服器重啟導致同一個tomcat出現很多程序,kill -9殺死又出現等一系列問題解決。 #ps -ef|grep tomcat檢視tom

Linux程序間關係守護程序

概念 守護程序也稱精靈程序,是執行在後臺的一種特殊程序。守護程序獨立於控制終端並且週期性的執行某種任務或者等待處理某些打算的事件。可認為守護程序目的就是防止終端產生的一些訊號讓程序退出 特點 所有的守護程序都沒有控制終端,其終端名(TTY)設定為問號(?

Linux下的守護程序建立方法

1、我們先來了解一下什麼是守護程序? 守護程序也稱精靈程序(Daemon),是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。守護程序是生存期長的一種程序。它們常常在系統引導裝入時啟動,僅在系統關閉時才終止。因為它們

linux usb列舉過程分析守護程序及其喚醒

usb熱插拔,即usb裝置可以實現即插即用,像U盤一樣,插到電腦裡就可以用,不用時可以直接拔除,這個動作不會影響USB裝置使用效能。        在linx 系統中,usb熱插拔由兩部分方面共同實現,即核心空間和使用者空間,核心由一個守護程序實現,使用者空間由udev 程式

linux學習筆記--程序進程管理

ref monitor vim 子進程 free task 排序 image ctrl 、工作管理 1、前臺程序放後臺程序 命令後 加 & 2、任務執行時將前臺任務任務放到後臺中並【暫停】 ctr + z 3、jobs 觀察後臺工作狀態 及多少任務

linux下使用crontab創建定時任務

文件格式 定時任務 下午 wal motd linux下 計劃任務 command sta 在linux中啟動crontab服務: /etc/init.d/crond start crontab的命令格式 crontab -l 顯示當前的crontab 文件(默認編寫的cr

crond定時任務詳解

ceo 開發 單用戶 init.d 管理 deny rest fin nta 首先來了解一下chkconfig這個命令: chkconfig命令檢查、設置系統的各種服務。這是Red Hat公司遵循GPL規則所開發的程序,它可查詢操作系統在每一個執行等級中會執行哪些系統服務,

python程序守護程序

標籤(空格分隔): 守護程序 主程序建立子程序,然後將該程序設定成守護自己的程序,守護程序就好比崇禎皇帝身邊的老太監,崇禎皇帝已死老太監就跟著殉葬了; 關於守護程序需要強調兩點: 其一:守護程序會在主程序程式碼執行結束後就終止 其二:守護程序內無法再開啟子程序,否則丟擲異常:Assert

Linux】多程序多執行緒之間的區別

http://blog.csdn.net/byrsongqq/article/details/6339240 網路程式設計中設計併發伺服器,使用多程序與多執行緒 ,請問有什麼區別?  答案一: 1,程序:子程序是父程序的複製品。子程序獲得父程序資料空間、堆和棧的複製品。 2,執行緒:相

Linux 使用者、許可權 Linux文件目錄結構

  目錄結構 Linux和Windows目錄結構的組織形式有很大不同,   Windows     劃分出了“盤”的概念(C盤、D盤、E盤),已經建立檔案系統的硬碟分割槽被掛載到某一個目錄下,使用者通過操作目錄來實現磁碟讀寫。     以反斜槓(\)分割目錄   Linu

Linux初識 VMwareCentos系統安裝 Linux文件目錄結構

關於虛擬機器的安裝 參考:VMware與Centos系統安裝 Linux和其他語言有些不同   如果輸入命令後沒有返回(這證明輸入的命令沒錯)   如果輸入的命令有返回(命令不一定是錯的,檢視命令除外) 第一次使用Linux建議將防火牆和selinux永久關閉(個人測試) 命

Python學習的第36天程序守護程序、互斥鎖

一、守護程序: 1、守護程序: 本質就是一個"子程序",該"子程序"的生命週期<=被守護程序的生命週期,當一個程序作為守護程序時 被被守護的程序死亡時 守護程序也跟隨死亡 2、使用 from multiprocessing import Process import time def ta

Docker學習守護程序

在讀《第一本Docker書》這本教程時,遇到Docker守護程序這個概念。首先需要理解守護程序是什麼,自然也就知道Docker守護程序的含義。 守護程序來自於Linux系統下的一部分,對於不太熟悉Linux系統的我來說,暫時只要知道守護程序是幹什麼的就可以了,所以寫一下我在查閱資料後對守護程序的

Linux文件目錄管理 Linux文件目錄結構

Linux之文件與目錄結構   Linux檔案系統結構 Linux目錄結構的組織形式和Windows有很大的不同。首先Linux沒有“盤(C盤、D盤、E盤)”的概念。已經建立檔案系統的硬碟分割槽被掛載到某一個目錄下,使用者通過操作目錄來實現磁碟讀寫。 Linux不

linux nohup守護程序

 前端js程式碼 var wsUrl = "ws://www.whl.com:9501"; var websocket = new WebSocket(wsUrl); //例項物件的onopen屬性 websocket.onopen = functi