深入探究Linux守护进程:释放你的代码力量!

2023-12-16 20:49:08

守护进程基本概念

守护进程 一种长期运行的进程:这种进程在后台运行,并且不跟任何的控制终端关联;

基本特点:

  • 生存期长*[不是必须,但一般应该这样做]*,一般是操作系统启动的时候他就启动,操作系统关闭的时候他才关闭;
  • 守护进程跟终端无关联,也就是说他们没有控制终端,所以你控制终端退出,也不会导致守护进程退出;
  • 守护进程是在后台运行,不会占着终端,终端可以执行其他命令

创建一个守护进程

编写守护进程的步骤

  • 分叉子进程(forking):解释为什么需要分叉子进程来创建守护进程。
  • 设置文件掩码(umask):保证守护进程有适当的文件权限。
  • 改变工作目录(chdir):避免守护进程与任何特定目录关联。
  • 关闭文件描述符(close file descriptors):避免与父进程共享的文件描述符。
  • 处理信号(handling signals):处理常见信号如SIGHUP、SIGTERM等。
  • 重新打开标准文件描述符(reopening standard file descriptors):使得守护进程不受终端关闭的影响。
  • 执行守护进程任务:守护进程开始执行实际的任务或服务。

守护进程编写规则

  • 调用umask(0);
  • umask是个函数,用来限制(屏蔽)一些文件权限的。
  • fork()一个子进程(脱离终端)出来,然后父进程退出( 把终端空出来,不让终端卡住);固定套路
  • fork()的目的是想成功调用setsid()来建立新会话,目的是
  • 子进程有单独的sid;而且子进程也成为了一个新进程组的组长进程;同时,子进程不关联任何终端了;

示例代码

提供一个简单的示例代码,展示如何在Linux中创建一个基本的守护进程。

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

int main() {
    pid_t pid, sid;

    // 创建子进程
    pid = fork();
    if (pid < 0) {
        exit(EXIT_FAILURE);
    }
    if (pid > 0) {
        exit(EXIT_SUCCESS);
    }

    // 修改文件掩码,使文件权限为最大
    umask(0);

    // 创建新的会话
    sid = setsid();
    if (sid < 0) {
        exit(EXIT_FAILURE);
    }

    // 改变工作目录
    if ((chdir("/")) < 0) {
        exit(EXIT_FAILURE);
    }

    // 关闭标准输入、输出、错误描述符
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // 守护进程的主要任务
    while (1) {
        // 在syslog中记录日志信息
        openlog("MyDaemon", LOG_PID, LOG_DAEMON);
        syslog(LOG_INFO, "Daemon is running...");
        closelog();

        // 在此处添加守护进程的任务或服务

        sleep(10); // 模拟守护进程在后台执行任务
    }

    exit(EXIT_SUCCESS);
}

这段代码演示了如何创建一个简单的守护进程。它分叉子进程,创建新的会话,改变工作目录到根目录,关闭标准输入、输出和错误描述符,并在一个无限循环中记录日志信息并执行守护进程的任务。请注意,这只是一个简化的示例,实际的守护进程可能需要更多的功能和错误处理。

守护进程不会收到的信号:内核发给你,另外的进程发给你的;

  • 守护进程虽然可以通过终端启动,但是不和终端挂钩,
  • 守护进程是在后台运行,他不应该在键盘上面接收任何东西,也不应该吧输出结果输出到屏幕或者终端上面去
  • 所以,按照"江湖规矩",我们要把守护进程的标准输入输出重定向到空设备中去
  • 从而确保守护进程不从键盘接收任何东西,也不把结果输出到屏幕

管理和调试守护进程

  1. 查看守护进程状态
    • ps命令:展示如何使用ps命令查看正在运行的守护进程。
    • top命令:介绍top命令及其用途。
  2. 日志记录
    • syslog:解释如何使用syslog来记录守护进程的日志。
    • 自定义日志文件:说明如何创建和管理自定义的守护进程日志文件。
  3. 调试守护进程
    • 日志输出:利用日志输出来调试守护进程中的问题。
    • 调试工具:介绍常用的调试工具如gdb等。

最佳实践和安全考虑

  1. 最佳实践
    • 错误处理:确保守护进程能够适当地处理错误和异常情况。
    • 资源释放:在守护进程结束时释放所有资源。
  2. 安全考虑
    • 权限管理:守护进程应该以最小特权运行,避免安全漏洞。
    • 输入验证:确保守护进程能够正确验证和处理输入数据。

结束语 总结守护进程的重要性以及如何在Linux系统中创建和管理它们。强调最佳实践和安全考虑,以确保守护进程的可靠性和安全性。

文章来源:https://blog.csdn.net/weixin_50448879/article/details/135036492
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。