【问题标题】:Writing a unix or perl script to check if a process is running编写 unix 或 perl 脚本来检查进程是否正在运行
【发布时间】:2011-07-05 13:41:56
【问题描述】:

我有 4 个应用服务器。我想检查所有 4 个是否都已启动并运行,所以我想编写一个脚本来检查所有应用程序服务器上的进程(我不必登录每个服务器并运行脚本)。应用服务器有一个共享文件夹,他们都可以访问,所以我可以把脚本放在那里。 我想找出在所有 4 个应用服务器上检查这个的最简单/最有效的方法。最初的计划是通过 ssh 连接到每台服务器,但这会要求您输入密码和其他会导致问题的提示。我正在考虑使用 keygen,但我在服务器上没有主目录,并且在生成密钥时遇到了问题。 我想知道是否有人可以建议通过脚本执行此操作的最佳方法。 perl 或 unix 哪个更好/更有效?除了 keygen 之外,还有其他我想念的选项吗? 任何建议将不胜感激。

谢谢。

【问题讨论】:

  • ssh 方法到底有什么问题?
  • 我不想在脚本中设置密码,我被告知将其作为参数传递是行不通的(因为它会提示您输入其他内容,例如说是) ,但 keygen 是为了让我无需密码即可执行此操作。我无法进行此设置,因为我在盒子上没有家庭资料(很快就会得到一个,但还没有)。我只是在寻找一些意见/想法,看看这是否是最好的方法,或者是否有更好的方法来做到这一点。
  • 你可能想看看期待。它使响应提示变得非常容易。但是,如果没有 ssh-keys,您仍然需要在脚本中输入密码,这不是很好。
  • 对于自动监控和恢复,我真的很喜欢 monit。它可能满足您的需求,也可能不满足您的需求,但可以将其视为在所有目标主机上运行的守护程序或作为单个监控主机上监控脚本的驱动程序。 mmonit.com/monit
  • 如果您可以向您的应用服务器添加功能,那么嵌入 Web 服务器(或其他 tcp 服务器)可能会更容易,这样您就可以在不需要在目标系统上进行探测。或者 ember 一个心跳发生器,这样他们就可以在不被询问的情况下报告他们的状态。如果你只有二进制文件,这显然不是一个选择。

标签: perl unix process


【解决方案1】:

我使用 Perl 做过类似的事情。如果你使用 Net:SSH:Expect,你可以用密码打开每台机器的连接,运行你的命令,检查输出并重复。

以下是您入门的方法。 CPAN - Net:SSH:Expect

进入所需机器的示例代码:

    my $ssh = Net::SSH::Expect->new(
        host     => $sshHost,
        password => 'password',
        user     => 'username',
        raw_pty  => 1
    );

my $login_output = $ssh->login(); # check if you logged in properly

# disable terminal translations and echo on the SSH server
$ssh->exec("stty raw -echo");

你可以调用 exec 来运行你需要的任何命令。

【讨论】:

    【解决方案2】:

    您可以在每台执行检查的服务器上运行一个 cron 作业,当该进程不存在时,发送一条消息 - 可以是 HTTP 请求、电子邮件,无论您喜欢什么。

    【讨论】:

    • 我想过使用 cron 作业,但我发现我不能为此使用 cron 作业。
    【解决方案3】:

    无法设置 ssh 密钥或 cron 条目;我的猜测是 rsh 也出来了。在我的头顶上;剩下的期望...http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod

    【讨论】:

      【解决方案4】:

      假设你可以运行一个脚本,这样的事情会起作用。

      #!/bin/sh
      if [ $# -ne 1 ]; then echo "Usage $0: <hispidfile>" >&2; exit 1; fi
      read otherpid < $1
      if [ "$otherpid" -lt 1 ]; then
        otherpid=""
      fi
      while :; do
       while kill -0 $otherpid
        do
         sleep 1
        done
       # restart other program
       # (really restarting myself in my peer configuration)
       echo restarting him
       sh -c 'echo $$ > '$1'; echo Him is running for 5 seconds PID=`cat '$1'`; sleep 5;' &
       newpid=0
       while [ "$newpid" -eq "$otherpid" -o "$newpid" -lt 1 ]
        do
         sleep 2
         read newpid < $1
        done
       otherpid=$newpid
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-21
        • 2019-03-10
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 2015-04-05
        相关资源
        最近更新 更多