首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux+配置守护进程

在Linux系统中,守护进程(Daemon)是一种在后台运行的特殊进程,通常用于执行系统级的任务,如服务器监听、日志记录、定时任务等。守护进程不与终端交互,即使终端关闭,守护进程也会继续运行。

基础概念

  • 进程组:守护进程会脱离控制终端,成为孤儿进程,并被init进程(PID为1)收养。
  • 会话领导:守护进程会成为新会话的领导者,以确保它不会重新获得控制终端。
  • 工作目录:守护进程通常会将工作目录切换到根目录(/),以避免占用文件系统。
  • 文件权限掩码:守护进程通常会设置文件权限掩码(umask)为0,以确保创建的文件具有预期的权限。
  • 日志记录:守护进程通常会将输出重定向到日志文件,以便于后续的问题排查。

配置守护进程的优势

  • 稳定性:守护进程在后台运行,不受用户登录或注销的影响。
  • 资源管理:守护进程可以有效地管理系统资源,如CPU和内存。
  • 服务持续:守护进程可以确保关键服务在系统重启后自动启动。

类型

  • 系统守护进程:由系统启动,为所有用户提供服务,如cron、sshd。
  • 用户守护进程:由特定用户启动,服务于该用户,如某些自动化脚本。

应用场景

  • Web服务器:如Apache、Nginx。
  • 数据库服务器:如MySQL、PostgreSQL。
  • 日志服务:如syslog。
  • 定时任务:如cron。

配置守护进程的一般步骤

  1. 编写守护进程程序:使用C、Python等语言编写守护进程程序。
  2. 脱离控制终端:使用fork()创建子进程,然后父进程退出,子进程继续运行。
  3. 创建新会话:使用setsid()创建新的会话,使子进程成为会话领导者。
  4. 改变工作目录:将工作目录切换到根目录。
  5. 设置文件权限掩码:使用umask(0)设置文件权限掩码。
  6. 关闭标准文件描述符:关闭标准输入、输出和错误文件描述符,并将它们重定向到/dev/null
  7. 日志记录:将输出重定向到日志文件。

示例代码(Python)

代码语言:txt
复制
import os
import sys
import time

def daemonize():
    try:
        pid = os.fork()
        if pid > 0:
            # Exit first parent
            sys.exit(0)
    except OSError as e:
        sys.stderr.write(f"Fork #1 failed: {e.errno} ({e.strerror})\n")
        sys.exit(1)

    # Decouple from parent environment
    os.chdir("/")
    os.setsid()
    os.umask(0)

    # Do second fork
    try:
        pid = os.fork()
        if pid > 0:
            # Exit from second parent
            sys.exit(0)
    except OSError as e:
        sys.stderr.write(f"Fork #2 failed: {e.errno} ({e.strerror})\n")
        sys.exit(1)

    # Redirect standard file descriptors
    sys.stdout.flush()
    sys.stderr.flush()
    si = open(os.devnull, 'r')
    so = open(os.devnull, 'a+')
    se = open(os.devnull, 'a+')

    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())

def main():
    while True:
        # Your daemon code here
        time.sleep(1)

if __name__ == "__main__":
    daemonize()
    main()

遇到的问题及解决方法

  • 守护进程无法启动:检查日志文件,查看是否有错误信息。
  • 守护进程占用过多资源:优化守护进程的代码,减少不必要的资源消耗。
  • 守护进程无法保持运行:确保守护进程在异常情况下能够自动重启,可以使用systemdsupervisord等工具进行管理。

使用systemd管理守护进程

systemd是现代Linux系统中常用的初始化系统和系统管理器,可以方便地管理守护进程。

  1. 创建服务文件:在/etc/systemd/system/目录下创建服务文件,如mydaemon.service
  2. 编写服务文件
代码语言:txt
复制
[Unit]
Description=My Daemon
After=network.target

[Service]
ExecStart=/path/to/mydaemon
Restart=always
User=myuser
Group=mygroup

[Install]
WantedBy=multi-user.target
  1. 重新加载systemd配置
代码语言:txt
复制
sudo systemctl daemon-reload
  1. 启动服务
代码语言:txt
复制
sudo systemctl start mydaemon
  1. 设置开机自启
代码语言:txt
复制
sudo systemctl enable mydaemon

通过以上步骤,可以方便地配置和管理Linux系统中的守护进程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

rsync 守护进程的配置

centos7.2 1.首先查看是否安装rsync的相关包 rpm -qa | grep rsync rsync-3.1.2-4.el7.x86_64 如果没安装就yum install rsync -y 2.配置文件...172.172.172.0/24 use chroot = yes list = yes auth users = root secrets file = /etc/rsync.passwd 解释下配置文件...uid,gid 指定全局配置为root 指定pid file 和log file的路径,也是全局变量 [root]  这个是模块的名称 path就是传过来的文件存放的位置,默认 ignore errors...是忽略io问题  这个配置文件中,可以用true ,false  或者yes和no都行 read only  是否只读,如果是yes的话,存不了文件,所以是no hosts allow  允许的ip,...secrets file = /etc/rsync.passwd   和上面的auth users照应,将密码写入到该文件,格式为 username:password 全部完成后,保存退出 3.启动守护进程

50830
  • 守护进程

    守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。...守护进程是一个在后台运行并且不受任何终端控制的进程。这也是守护进程最重要的特点。在Linux下创建守护进程的步骤如下。...创建子进程,终止父进程 这是因为守护进程是脱离终端控制的,所以要造成一种在终端里已经运行完的假象,把所有的工作都放在子进程中去完成。父进程退出后,子进程变成孤儿进程。...重设文件掩码 由于通过fork函数创建的子进程继承了父进程的文件掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件创建掩码设置为0,可以大大增强该守护进程的灵活性。...、 下面是在Linux系统下创建守护进程的一个简单示例。

    1.9K10

    守护进程

    SIGHUP (Hangup signal) 作用:最初用于通知进程,终端连接已经断开。对于守护进程来说,接收到 SIGHUP 信号通常意味着该进程应重新加载其配置文件。...守护进程行为:守护进程通常会忽略 SIGHUP 信号,这样即使终端连接断开,进程也会继续运行。 2....守护进程行为:守护进程可能会忽略 SIGCHLD 信号,特别是当它不需要对子进程的退出状态进行处理时。 6....守护进程行为:守护进程通常会忽略 SIGPIPE 信号。这是因为如果进程尝试向一个已经关闭的管道或套接字写入数据,默认情况下会导致进程终止。...这个调用会将进程转为守护进程。 sleep(60):模拟守护进程在后台执行任务,每分钟执行一次。

    7210

    守护进程

    5.1 概念 (1)什么是守护进程 Daemon(守护进程)是运行在后台的一种特殊进程。**它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。...Linux系统的大多数服务器就是通过守护进程实现的。 (2)为什么需要守护进程 守护进程是脱离于终端并且在后台运行的进程。...守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。...(3)守护进程实例 常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。...改变当前目录为根目录,防止占用其他可卸载的文件系统 d.重设文件权限掩码,防止继承的文件创建屏蔽字拒绝某些权限,增加守护进程的灵活性 e.关闭文件描述符 f.守护进程退出处理 ?

    1.9K20

    CentOs安装supervisord并配置守护进程

    Supervisor是一个客户端/服务器系统,允许其用户监视和控制类似UNIX的操作系统上的多个进程。 它具有一些与启动程序,daemontools和runit等程序相同的目标。...与这些程序中的某些程序不同,它不应作为“进程ID 1”的替代init运行。 相反,它旨在用于控制与项目或客户相关的过程,并且旨在在启动时像任何其他程序一样启动。...安装supervisord yum install supervisor 配置守护进程 在/etc/supervisord.d/下新建后缀名为ini的文件 ; 设置进程的名称,使用 supervisorctl...来管理进程时需要使用该进程名 [program:myblog] directory = /home/web/myblog ; 程序的启动目录 command=..../web/myblog/myblog_stdout.log loglevel=info 启动supervisord systemctl restart supervisord.service 启动我们配置的进程

    58830

    守护进程

    首先,什么是守护进程? 守护进程是一个在后台长期运行并且不受任何终端控制的进程。 其次,为什么需要守护进程?...我们知道linux有许多自带的守护进程,比如syslogd、crond、sendmail等。那用户或开发者自己编写的程序为什么也需要成为守护进程呢? 这主要是因为守护进程的特性。...目的很明显,我们不希望在该终端上见到守护进程的输出,用户也不期望他们在终端上的输入被守护进程所读取。 最后,举个例子来说明一下。...两次fork 守护进程两次调用fork就是出于僵尸进程的考虑:父进程生成守护进程后,还有其它事情要做,其『人生意义』不止是创建守护进程。...而如果父进程先fork子进程,子进程再立刻fork孙子进程,这样孙子进程成为守护进程,立刻被init接管,无论父进程怎么阻塞,都与守护进程无关了。

    2.8K40

    守护线程与守护进程

    一 守护进程 主进程创建守护进程   其一:守护进程会在主进程代码执行结束后就终止   其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes...are not allowed to have children 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 from multiprocessing import Process...无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕...,主线程才算运行完毕 详细解释: #1 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,...因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。

    1.9K90

    守护进程Supervisor

    安装完成后执行如下命令,生成默认配置文件: 1 echo_supervisord_conf > /etc/supervisord.conf 修改配置文件vim /etc/supervisord.conf...,将最后两行修改为: 12 [include]files = supervisord.d/*.ini 表示包含/etc/supervisord.d下的所有ini后缀的配置文件,其中每个ini代表一个进程的启动配置...一个jar进程的配置文件示例: 123456789101112131415161718 [program:demo]command=/usr/bin/java -jar /root/demo.jardirectory...supervisorctl start demosupervisorctl stop demosupervisorctl restart demosupervisorctl status 重新加载进程配置文件...可通过给进程划分组的方式变相实现,首先修改配置文件vim /etc/supervisord.conf,为进程设置组: 123 [group:mygroup]programs=demo1,demo2 ;

    83720

    Python 守护进程

    守护进程:通常被定义为一个后台进程,而且它不属于任何一个终端会话(terminal session)。许多系统服务由守护程序实施;如网络服务,打印等。 ...下面是转自一位网友写的编写守护进程的步骤: 1. 调用fork()以便父进程可以退出,这样就将控制权归还给运行你程序的     命令行或shell程序。...由于一个控制终端     与一个会话相关联,而且这个新会话还没有获得一个控制终端,我们的进程没     有控制终端,这对于守护程序来说是一件好事。 3....注意到许多守护程序使用‘sysconf()’来确认     ‘_SC_OPEN_MAX’的限制。‘_SC_OPEN_MAX’告诉你每个进程能够打     开的最多文件数。...然后使用一个循环,守护程序可以关闭所有可能的文件描     述符。你必须决定你需要做这个或不做。

    93530

    13(守护进程)

    13.2 守护进程的特征 守护进程是一种纯粹的后台进程,与运行前环境完全隔离,包括未关闭的文件描述符、控制终端、会话、进程组、工作目录以及文件创建掩码等 很多守护进程是父进程 fork 产生...,所以会继承所有的父进程地址空间中的环境,所以必须在守护进程诞生之初,断绝这些相关环境,当然,守护进程也可以在 linux 系统启动时从启动脚本 /etc/rc.d 中启动,也可以由 crontab 启动...事实上,守护进程与普通进程的编写并没有特别大的区别 13.3 编程规则 (1)进程从创建他的父进程那里继承了文件创建掩码,它可能会修改守护进程创建的文件的存取位。...这样做实现了以下两点:第一,如果该守护进程是通过shell命令启动的,那么父进程终止使得shell认为该命令已执行完毕。...SIGHUP, &sa, NULL) < 0) { perror("sigaction"); exit(-1); } // 再次 fork 让守护进程不再担当会话组长

    80010

    linux守护进程

    1、什么是守护进程 守护进程是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或循环等待处理某些事件的发生; 守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机才随之一起停止运行...; 守护进程一般都以root用户权限运行,因为要使用某些特殊的端口或者资源; 守护进程的父进程一般都是init进程,因为它真正的父进程在fork出守护进程后就直接退出了,所以守护进程都是孤儿进程,由init...接管; 2、有哪些常见的守护进程 日志服务进程 syslogd 数据库守护进程 mysqld 3、创建守护进程的步骤 1)fork()创建子进程,父进程exit()退出 这是创建守护进程的第一步。...因此从终端输入的字符不可能达到守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。...7)守护进程退出处理 当用户需要外部停止守护进程运行时,往往会使用 kill 命令停止该守护进程。所以,守护进程中需要编码来实现 kill 发出的signal信号处理,达到进程的正常退出。

    3.1K20

    Linux守护进程

    2、守护进程的使用和案例设计 为了深入理解如何创建和使用守护进程,我们将创建一个多功能的守护进程,具备以下功能: 资源监控功能:守护进程每隔 30 秒获取系统的 CPU、内存和磁盘使用信息,并将其写入...信号处理功能:守护进程能够捕获 SIGTERM 信号,安全退出,并能够处理 SIGHUP 信号重新加载配置文件。...信号处理: 捕获 SIGTERM 信号,干净地终止守护进程并进行资源释放。 捕获 SIGHUP 信号,重新加载配置文件(如改变日志文件的路径)。...reload_config():当捕获 SIGHUP 时,重新加载配置文件。...SIGTERM 信号用于干净地终止守护进程。 SIGHUP 信号用于重新加载配置文件,这里模拟了重新打开日志文件的过程。

    16410
    领券