このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

NetEvents+AppleScriptで指定ファイルにアクセスするには?

発言者:寺港みやび
( Date Wednesday, October 25, 2000 19:11:16 )


NetEvents 1.2.1と
田中先生のServer_check.txtを入手しました。
これでMacPerlのCGIが応答しなくなったら
Websterを終了させて・・・あとはPowerKeyProにまかせて・・・・と
苦肉の策をとりたいと思いました(;_^)
(無言になったMacPerlCGIは強制終了するしかないので)

サーバー自体はしなないので
特定のCGIだけをチェックしたいと思うのですが
----
property Server_address : "1192.168.1.1" --- サーバーのアドレス
property Server_port : 80 --- サーバーの走っているポート番号
----
このような変数に何かを加えれば
特定のページ(URL)を指定できるのでしょうか?
お手数おかけしますがよろしくお願いしますm(__)m


それとあまり関係ないのですがG?マシンには
付属のOSより以前のOSは入れられないですよね??

寺港みやび さんからのコメント
( Wednesday, October 25, 2000 19:15:28 )

すいません。
getPageSource.txtというお手本がありました。
参考にしてみます(^^;;)

田中求之 さんからのコメント
( Saturday, October 28, 2000 17:04:47 )

うまくいきましたか?

寺港みやび さんからのコメント
( Sunday, October 29, 2000 22:32:56 )

御心配ありがとうございます。

一応  NetEvents 1.2.1 BGでファイルにアクセス
するのは成功しました。
(というかほとんどサンプルのツギハギですが)

で、

if d does not contain "?????" then
      --reboot server!!
      tell application "WebSTAR 3.0.2"
        quit
      end tell
    end if

としてそのファイル(CGI出力ページ)に
あるべき文字列がない場合WebSTARを落とす
のもうまくいきました。落とした後は
KeepItUPに再起動をかけてもらう事にしました(^^;)

このスクリプトをPowerKeyで定期的に呼び出して
みようと思ったのですが、これではCGIがたまたま
ていっぱいで応答がなかった場合でも
リブートされてしまい困ってしまいます。

つまり仕様としてはやはり田中先生の
サーバー監視スクリプトのように
数回様子をみるという慎重さがほしいです。

ところがこのスクリプトを単純に
アイドリングで一定時間まわすと
ファイルの取得ができない(変数が空っぽ)
になったり、そのスクリプト以降を
実行しなくなったりするのです。

現状ではこんなところで汗をかいています。
なにかアドバイスをいただけますでしょうか・・・

寺港みやび さんからのコメント
( Thursday, November 02, 2000 11:12:32 )

あれこれ変造版を作ってみたんですが
基本に戻ってServer_check.txtに手を加えてみました。
これを実行すると結果ダイアログに-7.61140446E+8
と表示されて役目を果たすことができません。

やりたい事はCGIが応答しない場合も
エラーカウントを上げたいのですが・・・・

----
property myServer : "Macintosh HD:WebSTAR 3.0.2"
property crlf : (ASCII character 13) & (ASCII character 10)

property Server_address : "xxx.xxx.xxx.xxx"
property Server_port : 80

on run
  global dead_counter, tgAddr
  set dead_counter to 0
  
  tell application "NetEvents 1.2.1 BG"
    set tgAddr to NameToAddr Server_address
  end tell
end run


on idle
  global dead_counter, tgAddr
  
  tell application "NetEvents 1.2.1 BG"
    try
      set sss to OpenStream tgAddr port Server_port
      WriteStream Str data "GET /cgi-bin/test.cgi HTTP/1.0" & crlf & crlf
      
      set d to ""
      repeat
        set d to d & (ReadStream Str amount 4096)
        set stat to StatusStream Str
        if stat ュ "OPEN" and stat ュ "DATA" then exit repeat
      end repeat
      
      CloseStream sss
      
      set dead_counter to 0
      
      if d does not contain "yyyyy" then
        set dead_counter to dead_counter + 1
      end if
      
    on error
      set dead_counter to dead_counter + 1
    end try
    
  end tell
  
  if dead_counter > 2 then
    RestartServer()
    set dead_counter to 0
  end if
  
  return 60
  
end idle

on RestartServer()
  
  tell application "Finder"
    set myName to name of file myServer
    set liveFlg to myName is in (name of application processes)
  end tell
  
  if liveFlg then
    
    try
      tell application myServer to quit
    on error
    end try
    
    set waitTime to (current date) + 30
    repeat until ((current date) > waitTime)
    end repeat
    
  end if

  try
    tell application myServer to activate
  on error
  end try
  
end RestartServer
----
以上
添削いただければ幸いですm(__)m

田中求之 さんからのコメント
( Friday, November 03, 2000 10:40:52 )

>これを実行すると結果ダイアログに-7.61140446E+8
>と表示されて役目を果たすことができません。

田中求之 さんからのコメント
( Friday, November 03, 2000 10:41:38 )

>これを実行すると結果ダイアログに-7.61140446E+8
>と表示されて役目を果たすことができません。

スクリプト編集プログラムで実行したのでしたら、動作としては正しいです
よ。編集プログラムで実行した場合は run ハンドラーだけが実行されます
ので、ホスト名を IP アドレス(32 bit 整数の)に変換する動作しか行い
ませんから。

お書きになっているスクリプトは、StayOpen (実行後、終了しない)タイ
プのアプリケーションとしてセーブして、動かすものです(idle ハンドラー
を使ってチェックを行いますので)。こちらは試されましたか?

寺港みやび さんからのコメント
( Friday, November 03, 2000 15:53:29 )

ガーン。そうなんですか!!
編集プログラムで動作確認してから
終了しないアプリ形式で保存していました・・・(恥_恥;)

早速試してみます!ありがとうございました。

寺港みやび さんからのコメント
( Friday, November 03, 2000 19:43:34 )

今実行専用で自動的に終了しない形式で保存して
動かしてみました。
Webサーバーのログには何も表示されないのに
時間的に3回分エラーが出たと思われるころ
指定したアプリが終了してしまいました。

NetEvents 1.2.1 BG では状況がみえないので
BGでないものを指定してみたところ
コネクションが増えません。

Server_check.txtでも試してみたんですが
結果は同じでした。。。NetEvents 1.2.1では
なにかが変わってしまっているのでしょうか?
ためしてみた環境はPowerMac9500/200 MacOS8.1です。

(サーバーで試すの恐いので別のマシンから
サーバーマシンにアクセスしてみてエラーなら
シンプルテキストをWebSterという名前にして
実行させておいてそれを落とすテストしています^^;)

なにかもっともっと基本的な事をボケているような
予感がして恐いのですが・・・可能性があればお願いします。

田中求之 さんからのコメント
( Friday, November 03, 2000 22:04:41 )

>なにかもっともっと基本的な事をボケているような
>予感がして恐いのですが・・・可能性があればお願いします。

単純なタイプミスがあります。

* 半角カタカナを避けるために、≠は is not に書き換えてあります

      set sss to OpenStream tgAddr port Server_port
      WriteStream Str data "GET /cgi-bin/test.cgi HTTP/1.0" & crlf & crlf
      
      set d to ""
      repeat
        set d to d & (ReadStream Str amount 4096)
        set stat to StatusStream Str
        if stat is not "OPEN" and stat is not "DATA" then exit repeat
      end repeat

という部分ですが、stream を sss にセットしておきながら、サーバとの交
信部分では str という変数を stream として扱っています。ですから、こ
れでは、サーバへアクセス要求は送られませんよね。この部分を以下のよう
に書き換えれば、サーバへのアクセスをちゃんと行うようになります。

      set sss to OpenStream tgAddr port Server_port
      WriteStream sss data "GET /cgi-bin/test.cgi HTTP/1.0" & crlf & crlf
      
      set d to ""
      repeat
        set d to d & (ReadStream sss amount 4096)
        set stat to StatusStream sss
        if stat is not "OPEN" and stat is not "DATA" then exit repeat
      end repeat


寺港みやび さんからのコメント
( Saturday, November 04, 2000 08:03:45 )

ありがとうございました。
焦って結果を急いでいると良いことはないですね(=_=;)
おっしゃるとおりサーバーへアクセスできました。
お手数おかけしてすみませんでした。

これでCGIがパンチドランカーになっても安心です。
#さて、次はパンチドランカーにならないCGI環境を作らなきゃ(-_-;)