专栏首页小灰灰daemon函数结合脚本实现start, stop, restart

daemon函数结合脚本实现start, stop, restart

1. daemon函数

Daemon程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端不与前台交互,Daemon程序一般作为系统服务使用。Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程

int daemon (int __nochdir, int __noclose);

如果__nochdir的值为0,则将切换工作目录为根目录;

如果__noclose为0,则将标准输入,输出和标准错误都重定向到/dev /null。

经过这个函数调用后的程序将运行在后台,成为一个daemon程序,而linux下大多的服务都是以此方式运行的

2. daemon实例

最后生成的路径:/home/pc/workspace/daemon/test

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
    
int main(int argc, char *argv[])
{
    FILE* pidfp = fopen( "kmc_sa.pid", "w" );
    if ( pidfp == NULL )
    {
        perror("error daemon...\n");
        exit( 1 );
    }
      
    printf("path max %d\n", PATH_MAX);
    
    if(daemon(1, 1) < 0) // 若成功,则后面的代码就是后台服务代码
    {
        perror("error daemon...\n");
        exit(1);
    }
    printf("pid:%d\n", getpid()); // get process id
    printf("uuid:%d\n", getuid()); // get user id
      
      
    fprintf( pidfp, "%d\n", (int) getpid() ); // 将id保存到文件中,方便后续的关闭进程
    fclose( pidfp );
      
    // sleep(10);
    while(1)
    {
     ...具体的后台运行代码 }
    return 0;
}

脚本:test.sh

#!/bin/sh
 
echo "hello world", $1 #表示输出第一个参数
 
case "$1" in
 
    start)
    if [ -x /home/pc/workspace/daemon/test ] ; then #首先判断改程序是否为可执行的,是则开始执行
    echo "start..."
    /home/pc/workspace/daemon/test &
    fi
    ;;
 
    stop)
    kill -9 `cat kmc_sa.pid`    # 通过之前保存的进程号文件来关闭进程,cat前面的符号不是单引号,而是数字1代表的符号
    ;;
 
    restart) # 就是讲之前的两步再执行一遍
    echo "kill"
    echo "restart"
    ;;
     
    *)
    echo "usage: $0 { start | stop | restart}" >&2
    exit 1
    ;;
 
esac

3. 说明:

在上例test.c中,首先是利用daemon创建一个后台进程,在daemon后面的函数将是在后台执行的代码,特别是对于服务器代码而言,是一个while(1)总是监听端口的死循环,因此在关闭后台进程的时候,需要知道后台进程的pid,所以程序中在daemon执行后,利用getpid()函数获得子进程的pid,并将pid保存在一个文件中

    对于脚本程序,由于我并不懂,直接从一个开源的服务器启动脚本copy出来的,其是利用case来判断是执行哪个命令,需要注意的是在执行之前,首先对文件的属性进行判断,若是可执行文件方才继续执行;关闭进程则利用kill命令和之前保存的进程号来实现

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 线上故障实录-一大早服务就不可用了?

    难得一个周末,一大早还没有睡醒就接到另外一个团队的电话,app 打不开了,所有的数据都没有了,睡意全无,赶紧起来看能不能紧急抢救一下,最终发现是一个关键链路的 ...

    一灰灰blog
  • 借助GitHub搭建属于自己的maven仓库

    在Github上也写了不少的项目了,然后经常遇到的一个问题就是,很多自己写的项目,希望在另外一个项目中使用时,只能把这个项目下载下来,相当之不方便

    一灰灰blog
  • 如何借助GitHub搭建属于自己的maven仓库

    借助GitHub搭建属于自己的maven仓库 I. 背景 在Github上也写了不少的项目了,然后经常遇到的一个问题就是,很多自己写的项目,希望在另外一个项目中...

    一灰灰blog
  • PHP学习进程

    做为一个php痴迷者,我一直想整理一份系列学习php的计划。下面是我学习php进程计划。 1.准备知识:了解html,熟悉div+css,通过设计稿编辑前台 2...

    苦咖啡
  • 全国经济第一县为什么选择腾讯云数据库TDSQL

    8月16日,昆山农商银行举行新一代银行核心系统建设启动仪式。据了解,该系统将采用长亮科技最新“微服务+单元化”架构核心系统建设方案,并将国产分布式数据库腾讯云...

    腾讯云数据库 TencentDB
  • 如何修改CDH集群元数据库地址

    在生产环境CDH集群中会遇到元数据库的迁移,迁移后数据库的IP地址发生变化或是元数据库做主备,在主节点挂掉后,我们需要将数据库CDH集群中的元数据库地址指向新的...

    Fayson
  • 11. SpringCloud实战项目-初始化数据库和表

    SQL文件在这个项目里面:https://github.com/Jackson0714/PassJava-Platform.git

    悟空聊架构
  • 你还在用2345的软件吗?

    12月1日,“火绒安全实验室”发出警报,一款名为“云计算”的软件,正通过各种流氓渠道大肆推广,该软件除了把用户电脑当“肉鸡“进行挖矿外,没有任何其他功能...

    课代表
  • SAP云平台和SAP C4C之间的OAuth2.0配置

    The OAuth 2.0 based authentication between SCP and C4C requires the same user-id...

    Jerry Wang
  • 数据库防火墙:数据库防火墙商业化的前提条件

    数据库防火墙和一般的传统数据库安全设备不同,它部署在应用服务器和数据库服务器之间。业务系统巨大的流量将穿越数据库防火墙,数据库防火墙任何的风吹草动都会影响业务系...

    数据安全

扫码关注云+社区

领取腾讯云代金券