文档章节

守护进程daemon的创建和使用

JialinWu
 JialinWu
发布于 2013/12/11 22:23
字数 886
阅读 2.9K
收藏 15

                             daemon的创建和使用  


创建守护进的关键步骤:

step 1.创建子进程,父进程退出

step 2.在子进程中创建新会话

step 3.改变当前目录为根目录

step 4.重设文件权限掩码

step 5.关闭文件描述符

以下是一个简单的daemon例子

代码:

附1

附2

将file.c编译成名为  simple-daemon

然后在脚本daemon-script中编辑程序的名字和路径

将脚本daemon-script 复制到/etc/init.d/目录下

然后执行 chkconfig  - -add daemon-script 

可以看到chkconfig默认在run level 2 3 4 5下通过deamon-script脚本来启动指定的程序simple-daemon,在run level 0 1 6下通过deamon-script脚本来关闭指定的程序simple-daemon。 

也可以在terminal中以管理员的身份执行

service daemon-script start   //启动,当然系统默认是开启的  

service daemon-script stop   //停止

service daemon-script restart  //重启


附1:

//this app write the system time to testFile every two seconds 
//这个程序将会每间隔2秒在文件中写入系统时间(date),你可以在下面 arr 中定义文件的位置
//  file.c
//
//  Created by Jialin Wu on 11/12/13.
//
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
void daemonize(void) {
        pid_t  pid;

        /*
         * Become a session leader to lose controlling TTY.
         *创建子进程,父进程退出
         */
        if ((pid = fork()) < 0) {
                perror("fork");
                exit(1);
        } else if (pid != 0) /* parent */
                exit(0);
    
        //在子进程中创建新会话
        setsid();

        /*改变当前目录为/目录
         *如果程序要与数据库有关,可能会在更改当前目录后出不现莫名奇妙的错误,可尝试不更改当前目录
         * Change the current working directory to the root.
         * if you are using database  just ignore this and comment them. 
         */
        /*if (chdir("/") < 0) {
                perror("chdir");
                exit(1);
        }
        */

        //重设文件权限掩码
        umask(0);
    
        /*关闭文件描述符
         *
         */
        close(0);
        close(1);
        close(2);
    
        //Attach file descriptors 0, 1, and 2 to /dev/null.可选
        open("/dev/null", O_RDWR);
        dup2(0, 1);
        dup2(0, 2);

}

int main(int argc, const char *argv[])
{
    int file;
    struct tm* newtime;
    time_t ttime;

    daemonize();    //这个functione的作用就是使之成为daemon

    while(1){
        ttime=time(NULL);
        newtime = localtime(&ttime);
        
        char* arr= "/Users/jialin/Desktop/testFile"; //you might change the file path you want
        file = open(arr,O_WRONLY|O_CREAT);
        system("date >> /Users/jialin/Desktop/testFile");
        sleep(2);
        close(file);
    }
    
 return 0;
}

附2:

#!/bin/bash
### BEGIN INIT INFO
#
# Default-Start:  2 3 4 5
# Default-Stop:  0 1 6
# Description:  This file should be used to construct scripts to be placed in /etc/init.d.
#
# to use make this script work, for example:
# if you are using ubuntu:
# update-rc.d scriptName defaults 20 80 
# for more information find update-rc.d

# if you are using centOS or redHat:
#   chkconfig --add scriptName

#   defaults are 2345 on and 016 off so you can ignore the following steps if not try the followings:
#   chkconfig --level 2345 scriptName on
#   chkconfig --level 016 scriptNmae off 

#   for more information find chkconfig

### END INIT INFO


###########################
#start writing the script#
###########################
# Source function library  choose a library according to your linux distribution    and now I'm using centOS
#选择function library ,不同的Linux发行版function library 的位置不不相同
##ubuntu##
#. /lib/lsb/init-functions  如果在是ubuntu下的,把这句去掉注释,把下面centOS 加注释
##ubuntu##

##centOS or redHat##  我现在用的是centOS
. /etc/rc.d/init.d/functions
##centOS or redHat##

## Fill in name of program here.
PROG="guetoj_scheduler"
PROG_PATH="/home/jialin/judger" ## Not need, but sometimes helpful (if $PROG resides in /opt for example).

start() {
    $PROG_PATH/$PROG
        echo "$PROG started"
}

stop() {
    echo "begin stop"
       killall $PROG
        echo "$PROG stopped"
}

# Check to see if we are running as root first.
if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

case "$1" in
    start)
        start
        exit 0
    ;;
    stop)
        stop
        exit 0
    ;;
    reload|restart|force-reload)
        stop
        start
        exit 0
    ;;
    **)
        echo "Usage: $0 {start|stop|reload}" 1>&2
        exit 1
    ;;
esac
 

© 著作权归作者所有

JialinWu
粉丝 0
博文 1
码字总数 886
作品 0
桂林
程序员
私信 提问
加载中

评论(0)

Unix环境高级编程笔记 :13、守护进程

1 守护进程 守护进程也称精灵进程(daemon)是生存期较长的一种进程。它们常常在系统自举时启动,仅在系统关闭时才终止。 因为没的控制终端,所以它们是在后台运行的。 2、守护进程特征 父进程...

活的很快乐
2013/11/19
155
0
Linux多任务编程(七)---Linux守护进程及其基础实验

守护进程概述 守护进程,又叫daemon进程(不知怎的,我突然想起来吸血鬼日记中的达蒙了,很好看的美剧),是Linux中的后台服务进程。他是一个生存期较长的进程,通常独立于控制终端并且周期性地...

长平狐
2013/06/17
230
0
Python 模拟linux守护进程

用python模拟linux的守护进程,本篇主要模拟过程。不过也可以用现成的库来直接编写python版的守护进程程序。 参考代码如下: #!/usr/bin/python import sys,os,time,atexitfrom signal impor...

China_OS
2013/04/14
2.1K
5
直接使用docker而无须加sudo

The sudo command and the docker Group The docker daemon always runs as the root user, and since Docker version 0.5.2, the docker daemon binds to a Unix socket instead of a TCP p......

翟志军
2014/01/27
5.2K
5
python下编写守护进程

1、编写守护进程的步骤 Python创建守护进程其实和c创建守护进程的方式大同小异了,其实就是那么几个步骤: (1)创建子进程,父进程退出 (2)改变当前目录为根目录 (3)在子进程中创建新会...

翼动动空
2016/05/08
702
0

没有更多内容

加载失败,请刷新页面

加载更多

django

aiodns 1.1.1aiohttp 3.6.1asn1crypto 0.24.0async-timeout 3.0.1attrs 19......

MtrS
1分钟前
0
0
SQL查询单表数据(一)

本节讲述 基本的 select 查询单表数据语句 1 从单表中查询所有的行和列 查询表中所有的数据 select * from t_user 在 SQL 中,字符 "*" 具有特殊的含义,使用用它,将从指定的表中返回每一列...

赵子龙
8分钟前
5
0
签名与无符号整数

我是否正确地说有符号和无符号整数之间的区别是: 无符号可以保持较大的正值,而不是负值。 无符号使用前导位作为值的一部分,而带符号版本使用最左侧位来标识数字是正数还是负数。 有符号整...

javail
14分钟前
25
0
【Vue_05】前端工程化

一、ES6的模块化 1. ES6模块化规范 每个 js 文件都是一个独立的模块 导入模块成员使用 import 关键字 暴露模块成员使用 export 关键字 2. 基本语法 发使用 export default { }导出默认成员 ...

Demo_Null
15分钟前
18
0
阿里P7高级架构师分享6年多的Java工作经验(想冲破瓶颈者必看)

很多工作了五年左右的程序员每天已经习惯了机器般的写代码,如果是这样那么你永远只会是个基础程序员,因为你不能只会用,你要知道原理,不至于让你自己实现一个出来,但是基本原理要知道。 ...

JAVA一方
26分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部