首页 文章

编写一个linux守护进程

提问于
浏览
3

the 在Linux下编写/配置应用程序的正确方法是什么,它始终运行并提供外部请求(TCP,数据库,文件系统,任何类型) .

我特意不要调用这个守护进程,因为它可能意味着我不想在Linux环境中使用它 .

我已经阅读了多个主题,包括:

Linux daemonize

best way to write a linux daemon

Best practice to run Linux service as a different user

但没有一个能够充分比较使用哪种方法 .

我看到以下选项:

  • 编写应用程序,分叉,调用setpid,umask等,但这需要应用程序自己执行许多步骤; (使用init.d自动启动?)

  • 使用daemon()init.d函数执行大部分步骤(但它可以移植到所有/许多Linux发行版)

  • 用&运行应用程序并相信它在后台运行

但他们中的哪一个是 the 走的路 . 或者如果它们都可以使用,那么Linux中的守护进程是什么?

我正在寻找相当于在Windows下运行应用程序作为服务(并且任何.exe都可以自动生成,作为使用 sc 的服务运行) .


我的要求如下:

  • 启动后启动(自动)

  • 作为 specific 用户运行(不是root用户)

  • 可以访问整个文件系统(/),但创建/修改文件作为运行应用程序的用户

  • 可以通过服务启动,服务停止来控制

  • 可能在崩溃或终止后自动重启

  • 可以写入syslog

  • 在RHEL7下运行

我是应用程序的作者,但不希望改变它以处理守护进程 .

我的猜测是编写自定义init.d脚本,然后从/etc/init.d/functions调用daemon()函数 . 我对吗?

2 回答

  • 2

    RHEL7使用 systemd 作为其初始化系统,它将满足您的大多数要求 . 您应该为您的守护程序编写一个systemd unit file(在systemd用语中称为service) . 它可以:

    • 自动启动:是,使用 systemctl enable yourservice .

    • 作为特定用户运行:是,在单元文件中设置User键 .

    • 可以访问整个文件系统:是的,它将拥有您配置的用户拥有的所有权限,并以该用户身份创建文件 .

    • 可以通过 service start 控制:是,或通过 systemctl start .
      崩溃后

    • 自动重启:是,在单元文件中设置Restart键(例如, on-failurealways ) .

    • 写入syslog:程序写入标准输出的任何输出都写入systemd日志,可以根据需要使用journalctl查看和/或写入syslog .

    在现代init系统下运行时,您的应用程序不需要(也不应该)守护自身 . 这不仅适用于systemd,也适用于暴发户,以及runit,daemontools,supervisord和其他大多数主管 . 守护进程有点挑剔,容易出错 . 只需像往常一样编写应用程序,然后让init系统完成它的工作 .

  • 6

    如果我理解正确,特别是关于RHEL 7要求,Systemd Unit is your friend . 如果是您因任何原因尝试或丢弃的内容,请进一步详细说明 .

相关问题