编写unix或perl脚本以检查进程是否正在运行

时间:2011-07-05 13:41:57

标签: perl unix process

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

感谢。

4 个答案:

答案 0 :(得分: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来运行您需要的任何命令。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

假设您可以运行脚本,这样的事情就可以了。

#!/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