2011-07-05 81 views
2

我有4個應用程序服務器。我想檢查所有4個啓動和運行,所以我想寫一個腳本,我檢查所有應用程序服務器上的進程(沒有我必須登錄到每個和運行腳本)。應用程序服務器有一個共享文件夾,他們都可以訪問,所以我可以將腳本放在那裏。 我想找出最簡單/最有效的方法來檢查所有4個應用程序服務器。原來的計劃是ssh到每臺服務器,但這會要求您輸入密碼和其他提示問題。我正在考慮使用keygen,但是我沒有在服務器上的主目錄,並且遇到了生成密鑰的問題。 我想知道是否有人可以建議通過腳本來做到這一點的最佳方式。哪個更好/更高效,perl還是unix?除了keygen之外,還有其他選擇可以做到這一點嗎? 任何意見將不勝感激。編寫一個unix或perl腳本來檢查進程是否正在運行

謝謝。

+1

究竟什麼不適用於ssh方法? – tdammers

+0

我不想在腳本中設置密碼,並且我被告知將其作爲參數傳遞不起作用(因爲它會提示您執行其他操作,比如說是),但是keygen旨在允許我沒有密碼這樣做。我無法獲得此設置,因爲我的箱子上沒有家庭檔案(儘快獲得一個,但還沒有)。如果這是最好的方法,或者如果有更好的方法,我只是尋找一些意見/想法。 – MrMystery

+1

你可能想看看期望。它使提示響應非常容易。雖然沒有ssh-keys,但你仍然需要在腳本中輸入密碼,這並不是很好。 – frankc

回答

0

您可以在每個執行檢查的服務器上運行cron作業,並且當進程不在那裏時,發送消息 - 可能是HTTP請求,電子郵件,無論您喜歡什麼。

+0

我想過使用cron作業,但是我發現我無法使用cron作業。 – MrMystery

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運行任何你需要的命令。

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 
相關問題