いいね!数

0

閲覧数
757

こんにちは。

先日、こんなSSJSを実行してしまい、永久ループを作ってしまいました。

docsがNotesDocumentCollectionになってて、文書を取り出しながらあるフィールドから文字列を取り出そうというものです。

途中のcontinueに入り込むと永久ループになってしまいます。

    var list = [];
    var doc:NotesDocument = docs.getFirstDocument();
    while(doc) {
      var text = doc.getItemValueString(fieldname);
      print "text=" + text;
      if (text != "") {
        continue;
      }
      list.push(text);
      var next_doc = docs.getNextDocument(doc);
      doc.recycle();
      doc = next_doc;
    }

ここで質問です。Dominoは9.0.1で、OSはLinuxです。

(1) この手の永久ループを作ってしまったときに、ある程度時間が経過したときにSSJSを自動停止させるようなDominoサーバの設定はありませんか?

(2) 走り出してしまったこの処理を強制停止させるDominoサーバのコマンドはありませんか?

このときはサーバコンソールにログが連続して出力される状況だったので、httpプロセスをOSのkillコマンドで停止させたり、Dominoサーバを強制終了させる荒業を使いました。実行させているユーザー名は特定できてるので、そのユーザーのプロセスだけ強制終了させるとかできそうな感じがするのですが。

/Yac

サーバー情報: | クライアント情報: | 
カテゴリ:Domino - 設定 | タグ:
  | 質問日時:Feb 24, 2016, 7:17:45 AM

回答・コメント

いいね!数

0

動作確認はしていないですが、サーバー文書で WebエージェントとWebサービスのタイムアウト時間が設定可能のようです。


xpages - Web agent and web service time out can stop http hang in domino? - Stack Overflow http://stackoverflow.com/questions/34738435/web-agent-and-web-service-time-out-can-stop-http-hang-in-domino

回答日時:Feb 24, 2016, 8:22:04 AM

いいね!数

2

yac様

昔自分もLSですが無限ループやってしまったことがあります。

その時はDomino AdministratorでTell コマンドを行い止めた記憶があります。

http://www-01.ibm.com/support/knowledgecenter/SSKTMJ_9.0.1/admin/admn_agentmanagertellcommands_r.dita?lang=ja

 

mak

回答日時:Feb 24, 2016, 9:30:37 AM

いいね!数

1

ykawaさん、makさん、回答ありがとうございます。

Stack Overflowの回答によると、サーバのタイムアウトの設定は以下の部分のようです。

サーバ文書→インターネットプロトコル→Domino Web Engine

初期状態ではタイムアウト無しの"0"が設定されてたので、ここを10に変更し、Dominoを再起動してみました。

残念ながらここのタイムアウト値は効果ないようです。10秒待っても特に動作はとまらず(サーバコンソールにデバッグログが出続ける)、結局Dominoのプロセスを1つづつkillするしかありませんでした。

また、永久ループ中にサーバコンソールからtell http quitをやってみましたが、デバッグメッセージはとまりませんでした。デバッグメッセージを出すのをやめてみたら、こんなレスポンスが。「処理が終わるのを待ってる」という意味なので、これではダメそう。

HTTP Server: Waiting for session to finish: Session State ....

/Yac

 

回答日時:Feb 25, 2016, 12:27:03 AM

いいね!数

1

SSJS 単体の実行だとエージェントでもサービスでもないからタイムアウト制御外ということなんでしょうかね。

 

下記によるとIBMの回答としても「手の施しようがないので慎重にテストしてください」らしいです…

Restart HTTP task in Domino after infinite loop in SSJS causes process to hang - Server Fault
http://serverfault.com/questions/616689/restart-http-task-in-domino-after-infinite-loop-in-ssjs-causes-process-to-hang

回答日時:Feb 25, 2016, 8:14:56 AM

いいね!数

0

いろいろ調べていただきありがとうございました。

ちょっと意外でした。

私の場合は社内用だったので運用と開発は同じサーバでやってたのですが、ちょっと怖いですよね。分離しないとダメかしらん。

今まで膨大なDomino用のコード書いてきたけど、たまたま永久ループ作らなかっただけかいな。

これまでサンプルのnsfファイル結構気軽に自分のサイトやここのQAにも貼り付けてたけど、よそ様のサーバを落とす可能性が少しでもあると思うと、やめといた方がいいのかなぁ、という気になってしまう。

うーん。

/Yac

回答日時:Feb 25, 2016, 12:46:18 PM

いいね!数

0

IBMのサポートにも確認しましたが、いい手は無いようです。

フツーのXPagesアプリならwhileやforループは結構出て来るので、気をつけないといかんですね。

/Yac

回答日時:Mar 4, 2016, 8:03:49 AM