crond 與 守護進程


一、 crond  (定時任務管理)

  1、crond 是linux用來定期執行程序的命令。當安裝完成操作系統之後,默認便會啓動此任務調度命令。crond命令每分鍾會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。而linux任務調度的工作主要分爲以下兩類: 
        1)系統執行的工作:系統週期性所要執行的工作,如備份系統數據、清理緩存 
        2)個人執行的工作:某個用戶定期要做的工作,例如每隔10分鐘檢查郵件服務器是否有新信,這些工作可由每個用戶自行設置 

    2、crontab    // 讓使用者在固定時間或固定間隔執行程式
(1)使用方式 :   crontab -l|-r|-e|-i [username]

(2)說明 : 
     usename :指設定指定 user 的時程表(前提:必須要有其權限才能夠指定他人的時程表)。如果不使用 -u user 的話,就是表示設定自己的時程表。 
(3)參數 : 
        -e : 執行文字編輯器來設定時程表(  內定的文字編輯器是 VI  )      crontabl -e
        -r : 刪除目前的時程表    crontabl -r 
        -l : 列出目前的時程表    crontabl -l

        -i : 刪除時程表前給提示    crontabl -ri    

 (4)   時程表   的格式 :     f1   f2   f3   f4   f5   program 
      注:     f1 :分鐘,f2 :小時,f3 :日期,f4 :月份,f5 :    ,program :要執行的程式。 

    若 f1(f2... ...) :“  *  ” ---> 每分鐘(小時... ...)都要執行程式

           "    */n   "   ---->  每 n 分鐘(... ...)個時間間隔執行一次

      " a, b, c,... "---> 第 a, b, c,... 分鐘(... ...)要執行

(5)使用者也可以將所有的設定先存放在檔案 file 中,用 crontab file 的方式來設定時程表。 
     使用方法: 用VI編輯一個文件 cronfile,然後在這個文件中輸入格式良好的時程表。編輯完成後,保存並退出。

            $: crontab cronfile 

(6)使用方法:

    service crond start   啓動cron服務;

    service crond stop    停止cron服務;

    service crond restart  重啓cron服務;

    service crond status  查看當前cron狀態


    用戶的crontab文件存放在目錄/var/spool/cron下,文件名就是用戶名;

    比如在root的crontab文件中寫入命令:

    */1 * * * * echo It's study time >> test.txt

    即,每隔一分鐘打印出“It's study time”。

二、守護進程  (沒有控制終端)

    守護進程,亦稱爲“精靈進程”。守護進程是運行在後臺的一種特殊進程。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件,即不與任何控制終端相關聯。

    守護進程通常採用以d結尾的名字,表示 Daemon.


    參數a:列 當前用戶的進程 + 所有其他用戶的進程

    參數x:列 有 控制終端的進程 + 所有 無控制終端的進程

    參數j:列出 與 作業控制相關的信息。

        例:ps axj | grep -E 'd$'  // 查找所有 以d結尾 的進程

               

      TPGID:-1 --> 沒有控制終端的進程(守護進程)

      COMMAND:[] ---> 內核進程

創建守護進程

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

    2. 調用 fork,父進程退出(exit)。

        原因:1)如果該守護進程是作爲一條簡單的shell命令啓動的,那麼父進程終止使得shell認爲該命令已經執行完畢。

              2)保證子進程不是一個進程組的組長進程。

    3. 調用setsid創建一個新會話。     ( setsid(); )

        setsid會導致: 1)調用進程成爲新會話的首進程。

              2)調用進程成爲一個進程組的組長進程 。

              3)調用進程沒有控制終端。(再次fork一次,保證daemon進程,之後不會打開tty設備)

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

    5. 關閉不在需要的文件描述符(輸入輸出錯誤)。

    6. 其他:忽略SIGCHLD信號。

實例:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<errno.h>

#define MAXFILE 3
void my_daemon()
{
	int i=0;
	int fd;
	struct sigaction sa;
	sa.sa_handler = SIG_IGN;
	sa.sa_flags = 0;
	sigemptyset(&sa.sa_mask);

	umask(0);
	pid_t id=fork();
	if(id < 0)
	{
		perror("fork");
		exit(1);
	}
	else if(id > 0)//father
	{
		exit(0);
	}

	setsid();

	if(id < 0)
	{
		perror("fork");
		exit(1);
	}
	else if(id > 0)//father
	{
		exit(0);
	}



	if(chdir("/") < 0)
	{
		perror("chdir");
		exit(1);
	}
	for(int i=0;i<MAXFILE;i++)
	{
		close(i);
	}
	signal(SIGCHLD,SIG_IGN);
	close(fd);
}
int main()
{
	FILE *fp;
	time_t t;
	my_daemon();
	while(1)
	{
		sleep(6);
		if( (fp=fopen("./test.log", "a")) >= 0)
		{
			int i=0;
			t = time(0);
			fprintf(fp, "[%d]hello friends \n", i++);
			fclose(fp);
		 }
	}
	return 0;
}




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