当前位置: 首页 > 面试题库 >

在Linux中创建守护程序

缑赤岩
2023-03-14
问题内容

在Linux中,我想添加一个无法停止且监视文件系统更改的守护程序。如果检测到任何更改,则应在启动控制台的路径上加上换行符。

我已经准备好更改代码的文件系统了,但是我不知道如何创建守护程序。

我的代码来自这里:http :
//www.yolinux.com/TUTORIALS/ForkExecProcesses.html

叉后该怎么办?

int main (int argc, char **argv) {

  pid_t pID = fork();
  if (pID == 0)  {              // child
          // Code only executed by child process    
      sIdentifier = "Child Process: ";
    }
    else if (pID < 0) {
        cerr << "Failed to fork" << endl;
        exit(1);
       // Throw exception
    }
    else                                   // parent
    {
      // Code only executed by parent process

      sIdentifier = "Parent Process:";
    }

    return 0;
}

问题答案:

在Linux中,我想添加一个无法停止且监视文件系统更改的守护程序。如果将检测到任何更改,则应将路径写入启动它的控制台+换行符。

守护程序在后台工作,并且(通常…)不属于TTY,这就是为什么您无法以可能想要的方式使用stdout /
stderr的原因。通常,使用syslog守护程序( syslogd )将消息记录到文件中(调试,错误等)。

除此之外,还有一些 必需的步骤 来守护进程。

如果我没有记错的话,这些步骤是:

  • 分叉 父进程,如果分叉成功,则终止它。->由于父进程已终止,因此子进程现在在后台运行。
  • setsid- 创建一个新会话。调用过程将成为新会话的负责人和新过程组的过程组负责人。现在,该过程已从其控制终端(CTTY)分离。
  • 捕获信号 -忽略和/或处理信号。
  • 再次分叉并 让父进程终止,以确保您摆脱了会话引导进程。(只有会议负责人才能再次获得TTY。)
  • chdir- 更改守护程序的工作目录。
  • umask- 根据守护程序的需要更改文件模式掩码。
  • close- 关闭所有可能从父进程继承的打开文件描述符。

为您提供一个起点:查看显示基本步骤的此框架代码。现在,也可以在GitHub上分叉此代码:linux守护程序的基本框架

/*
 * daemonize.c
 * This example daemonizes a process, writes a few log messages,
 * sleeps 20 seconds and terminates afterwards.
 */

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

static void skeleton_daemon()
{
    pid_t pid;

    /* Fork off the parent process */
    pid = fork();

    /* An error occurred */
    if (pid < 0)
        exit(EXIT_FAILURE);

    /* Success: Let the parent terminate */
    if (pid > 0)
        exit(EXIT_SUCCESS);

    /* On success: The child process becomes session leader */
    if (setsid() < 0)
        exit(EXIT_FAILURE);

    /* Catch, ignore and handle signals */
    //TODO: Implement a working signal handler */
    signal(SIGCHLD, SIG_IGN);
    signal(SIGHUP, SIG_IGN);

    /* Fork off for the second time*/
    pid = fork();

    /* An error occurred */
    if (pid < 0)
        exit(EXIT_FAILURE);

    /* Success: Let the parent terminate */
    if (pid > 0)
        exit(EXIT_SUCCESS);

    /* Set new file permissions */
    umask(0);

    /* Change the working directory to the root directory */
    /* or another appropriated directory */
    chdir("/");

    /* Close all open file descriptors */
    int x;
    for (x = sysconf(_SC_OPEN_MAX); x>=0; x--)
    {
        close (x);
    }

    /* Open the log file */
    openlog ("firstdaemon", LOG_PID, LOG_DAEMON);
}



int main()
{
    skeleton_daemon();

    while (1)
    {
        //TODO: Insert daemon code here.
        syslog (LOG_NOTICE, "First daemon started.");
        sleep (20);
        break;
    }

    syslog (LOG_NOTICE, "First daemon terminated.");
    closelog();

    return EXIT_SUCCESS;
}
  • 编译代码: gcc -o firstdaemon daemonize.c
  • 启动守护程序: ./firstdaemon
  • 检查一切是否正常: ps -xj | grep firstdaemon

  • 输出应与此类似:

    • ------ + ------ + ------ + ------ + ----- + ------- + ------ + ------ + ------ + ----- +
      | PPID | PID | PGID | SID | TTY | TPGID | STAT | UID | 时间| CMD |
    • ------ + ------ + ------ + ------ + ----- + ------- + ------ + ------ + ------ + ----- +
      | 1 | 3387 | 3386 | 3386 | ?| -1 | S | 1000 | 0:00 | ./ |
    • ------ + ------ + ------ + ------ + ----- + ------- + ------ + ------ + ------ + ----- +

您应该在这里看到的是:

  • 守护程序没有控制终端( TTY =?
  • 父进程ID( PPID )为 1 (初始化进程)
  • PID!= SID ,这意味着我们的进程不是会话组长
    (因为第二叉())

  • 由于PID!= SID,我们的过程 无法再次控制TTY

读取系统日志:

  • 找到您的系统日志文件。我的在这里:/var/log/syslog
  • 做一个: grep firstdaemon /var/log/syslog

  • 输出应与此类似:

    firstdaemon [3387]:第一个守护程序已启动。
    firstdaemon [3387]:第一个守护程序终止。

注意: 实际上,您还需要实现信号处理程序并正确设置日志记录(文件,日志级别…)。

进一步阅读:



 类似资料:
  • 在Linux中,我想添加一个无法停止的守护进程,它监视文件系统的更改。如果检测到任何更改,它应该写入启动控制台的路径以及换行符。 我已经准备好了更改文件系统的代码,但是我不知道如何创建守护进程。 我的密码是:http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html 叉子用完后怎么办?

  • 问题内容: 在Google上搜索会发现x2代码段。第一个结果是该代码配方的内容,其中包含大量文档和说明,并在下面进行了一些有用的讨论。 但是,另一个代码示例虽然没有包含太多文档,但包含用于传递命令(例如启动,停止和重新启动)的示例代码。它还会创建一个PID文件,可以方便地检查守护程序是否已在运行等。 这些示例都说明了如何创建守护程序。还有其他需要考虑的事情吗?一个样本比另一个样本好吗,为什么? 问

  • 问题内容: 创建可在Linux上使用“服务”运行的Java应用程序的最佳方法是什么?我打算使用此处提供的JSW ,但不能在此上使用许可证(许可证是GPL或据我所知要花钱)。我需要apache样式许可。 我正在使用maven进行构建,因此,如果可以使用maven插件创建服务,那就太好了,但是其他建议也都很棒。 我已经看过Apache Commons Daemon ,是否为此有一个Maven插件?文档

  • 问题内容: 我正在编写Linux守护程序。我发现了两种方法。 通过调用和设置守护进程。 使用运行程序。 哪个是正确的方法? 问题答案: 来自http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16 以下是成为守护程序的步骤: 1. fork(),以便父级可以退出,这会将控制权返回给命令行或shell来调用您的程序。需要执行此步骤,以确保新流程不

  • 问题内容: 这里有人在Golang中编写了守护进程吗?你能指导我如何做吗?欢迎有用的链接。 问题答案: 是的,这已经完成。请参阅go-daemon项目。请注意,启动goroutine 后 在守护进程中发生某些问题。有关详细信息,请参见问题227。 目前,我建议您使用操作系统提供的实用程序。

  • 问题内容: 在Ruby中创建行为良好的Unix或Linux守护程序的正确方法是什么? 无论如何,行为良好的守护程序的定义是什么,如何用Ruby编写这样的程序? 问题答案: 根据 UNIX环境 第13章的Stevens 高级编程 ,这是制作行为良好的Unix守护程序的过程: 分叉并有父出口。这使Shell或引导脚本认为命令已完成。此外,保证子进程不会成为进程组负责人(下一个setsid的先决条件)