AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 16243
Accepted
racbear
racbear
Asked: 2009-06-01 06:57:21 +0800 CST2009-06-01 06:57:21 +0800 CST 2009-06-01 06:57:21 +0800 CST

当一个守护进程死亡时执行某些东西的Shell脚本?

  • 772

我只需要构建两个在不同端口上运行的守护进程实例。假设它们都服务于某些应用程序的关键任务。

当其中一个无法服务时,如何执行一些自动任务(例如 shell 脚本)来检查两个守护进程?

什么样的脚本可以始终检查守护程序的生命,并且如果其中一个守护程序意外停止,也许可以执行其他一些工作?

scripting shell daemon
  • 7 7 个回答
  • 3459 Views

7 个回答

  • Voted
  1. Best Answer
    drybjed
    2009-06-01T07:27:45+08:002009-06-01T07:27:45+08:00

    monit在这种情况下很棒 - 它在 localhost 上运行,因此您不需要网络连接来重新启动您的守护程序(以防它失败,或者守护程序负责网络)。它在系统上的占用空间也很小,您可以使用它来监控您的其他守护进程/磁盘空间/等。也是。

    创建一个启动/停止脚本(类似于在/etc/init.d/系统用于正常操作的运行级别中为它创建符号链接,确保您的守护程序将在重新启动时启动并在正常关闭时停止。如果您的守护程序没有 pidfile,请创建一个使用start-stop-daemon脚本。

    之后,monit为您的守护程序安装并创建配置,如下所示:

    使用 pidfile /var/run/daemond.pid 检查进程守护进程
        启动程序“/etc/init.d/daemond start”
        停止程序“/etc/init.d/daemond stop”
        如果在 10 个周期内 5 次端口 1234 类型 TCP 失败,则重新启动
        如果 3 个在 5 个周期内重新启动,则发出警报
    

    此配置将确保如果守护程序在 tcp 端口 1234 上停止响应,或者将停止运行,它将使用 init 脚本重新启动。monit还会通过电子邮件向您发送警报,或执行其他操作,具体取决于您的配置方式。只需查看monit(1)手册页。

    • 7
  2. Xerxes
    2009-06-01T07:03:06+08:002009-06-01T07:03:06+08:00

    很大程度上取决于守护进程。

    如果守护程序有一个 API,并且您可以通过 TCP/IP 套接字或 UNIX 套接字与其通信,那么您可以这样做。

    例如,如果它侦听 TCP/IP 端口,您可以编写一个连接到它的脚本,期望得到某个响应 - 以及获得该响应所需的时间 - 您可以将其提供给监控工具,例如 nagios, munin 或其他 - 无论您最终编写什么脚本来执行单个检查,您都可以轻松地集成到例如 nagios 插件中 - 这可能是您想要做的 - 一旦您编写了检查脚本。

    如果它没有为您提供任何有用的信息,不监听端口,那么您真正能做的就是使用 lsof、netstat 或类似的东西检查进程树,并确保它存在,但您不能真正做到健康查看。

    您需要更加具体,才能在这里的任何人为您提供有用的东西。

    查看正在运行的守护进程的 PID,然后查看下面/proc/<PID>/fd的视图以了解守护进程正在与之交互的管道/套接字/文件 - 这可能会帮助您入门。

    • 0
  3. Matt Simmons
    2009-06-01T07:04:52+08:002009-06-01T07:04:52+08:00

    我的建议是使用您(希望)现有的监控基础设施。

    我使用 Nagios,并使用 SNMP 查询我的 Linux 机器。Linux MIB 允许我检索所有正在运行的进程的名称,以及 PID 和参数。我用它来监视不打开端口的各种守护进程(如 crond)。

    • 0
  4. Outdoor
    2009-06-01T07:28:20+08:002009-06-01T07:28:20+08:00

    好吧,我有一个最喜欢的检查方法,当它死去时,它非常简单。只需使用以下命令启动它:

    /path/to/daemon || mail [email protected] "/path/to/daemon dead; do X" 或:

    而 [[ -z "" ]]; 做/path/to/daemon || mail [email protected] "/path/to/daemon 死了;重新启动"; 完毕

    或类似的东西。如果出现问题时守护程序将退出,这将为您提供非常简单和可靠的监控。

    • 0
  5. Simon Kelly
    2009-06-01T09:27:59+08:002009-06-01T09:27:59+08:00

    也许您可以尝试使用 init 守护程序启动任务(假设这是 Unix,其他答案似乎已经完成)。查看 inittab 的手册页,其中应详细说明如何操作。您可以安排您的进程在引导时启动,或在特定的运行级别启动。

    如果您使用 respawn 选项,那么您的进程将在失败时自动重新启动 - 即 init 守护进程是一个内置的进程监视器以​​及进程启动器。但是,init 守护进程也有一些“智能”,因此如果您的守护进程在太短的时间内过于频繁地重新启动,那么最终 init 将停止尝试再次启动它几分钟。例如,这使得流氓进程更难意外消耗机器上的所有 CPU。

    init 通常也会被配置为在 /var/log 某处记录条目,因此您可以免费获得日志记录。

    • 0
  6. tylerl
    2009-06-01T13:03:47+08:002009-06-01T13:03:47+08:00

    不知道为什么没有人列出明显的简单解决方案:

    #!/bin/bash
    ps ax | grep "[p]rogie" >/dev/null 2>&1
    if [ $? != 0 ] ; then
        # do something
    fi
    
    • 0
  7. Daniel Lawson
    2009-06-01T13:46:59+08:002009-06-01T13:46:59+08:00

    我会通过像 nagios 这样的网络监控工具或像其他海报之一推荐的自定义脚本来推荐monit或god来完成此类任务。

    另一张海报包含了 Monit 的配置片段;上帝在概念上相似,但用红宝石写成。这两个工具都是为处理这种情况而编写的,并且提供比自定义脚本更大的灵活性(如果进程存在但没有响应怎么办?如果你的 grep 匹配一个你没有预料到的不同进程怎么办? ? ) 并提供“开箱即用”的阈值和滞后支持。

    我可能将 Nagios 用作单独的警报和通知路径,但我不会将其用作监视和重新启动进程的唯一方式,原因与我不会使用手写脚本相同——它没有提供足够的灵活性对于大多数监控情况,虽然您可以触发事件(例如重新启动服务),但它没有像 monit 这样的工具那样灵活。

    • 0

相关问题

  • 我可以“注册”python 脚本以在 Windows 上执行吗?

  • 如何找出正在运行的 Linux 版本?

  • 如何将终端命令启动到多个选项卡中?

  • 如何最好地编写 SQL Server 2008 上选定的表和数据的脚本?

  • 获取目录总大小的 PowerShell 脚本

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve