PerlスクリプトをFedoraで動かしています。

バックグラウンドで走らせた状態にして、terminalは閉じてしまっています。

そして5時間くらい動いたあと、「ハングアップ」したように感じます。
ここで「ハングアップ」とは、psコマンドで表示されるがスクリプトどおりに
動作していない状態を指しています。
2770 ? S 0:46 perl ./test.pl
また、ログが途中、(まさにprint文で書き込まれる一続きの単語の途中のアルファベット)
で止まってしまいます。CPUの動作時間は毎回異なります。

また、異なる内容のスクリプトでも、同じ現象になりますが、CPUの動作時間は内容によって
大幅に異なるため、CPUの動作時間でぶった切られているわけではないと思います。

以前から全く異なるスクリプトやマシンで起こるので、そういうものなのだと思いますが、
どのような閾値だったり設定で起こっているのかを教えてください。
回避の方法があればそれもお願いします。

自らインストールしたFedoraです。
RedHatでも同様だったと思います。
サーバの設定は、デフォルトに近い状態です。

どうぞ、よろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/11/17 17:12:29
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:b-wind No.4

回答回数3344ベストアンサー獲得回数440

ポイント35pt

スクリプトがメモリー破壊しています。

いや、perl でそういうことやるのはむしろ難しいし、

その場合素直にコアはいて止まるよ。


基本的に perl の側ではメモリや実行時間の制限等は一切無い。

【 ulimit 】 コマンドに割り当てる資源を制限する - Linuxコマンド集:ITpro

ulimit 等でOS側で制限している可能性もあるが、

CPUの動作時間は毎回異なります。

ということなので可能性は低そう。


まさにprint文で書き込まれる一続きの単語の途中のアルファベット

というのが一番気になるところで、エラーがあったとしても一連の文字列の途中で

止まることはまれ。(perl に限らず出力がバッファリングされている場合)


ほかに計測データが無いので断言はしかねるが、純粋にディスク容量がいっぱいになるか

メモリを使い果たしたというのが一番想像しやすい現象ではある。

id:okenji

的確なご指摘ありがとうございます。

coreは見当たりません。スクリプトは終了していませんしね。

% ulimit

unlimited

でした。

「メモリや実行時間の制限等は一切無い」と断言いただいたので、可能性が絞れた分、嬉しいです。

topコマンドで追う限り、メモリがどんどん増えるようなことはなく、一定でした。(5時間全て見たわけではありませんが。)

いずれにしても、知識ある方の考察は有意義でした。ありがとうございました。

2009/11/13 21:37:40

その他の回答3件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント20pt

過去に同じような目(寝る前に起動して、朝起きたら終わってるはずが、

半分くらいで止まってた・・・)にあった際に取った対応なので、

お役に立つかと思い回答させていただきます。


スクリプトとしては読みづらくなったり、駄々長くなったり、

perlの使いやすさを殺してるじゃないかと思う箇所があったりもしますが、

・再起呼び出しを減らす

・ifなどのネストを減らす

・ループを減らす

・1つのループで回る回数を減らす

・1つのループ内では極力簡単なコードだけとし、長大なコードを実行しないようにする

など改造してみてください。

id:okenji

同様なことで悩まれたとのことで、貴重なご意見ありがとうございます。

試してみます。

書き忘れたのですが、DBIモジュールでMysqlへのコネクションを開きっぱなしでsqlを投げまくっています。それがいけないのかな・・・

2009/11/12 01:24:17
id:goog20090901 No.2

回答回数637ベストアンサー獲得回数17

ポイント3pt

スクリプトがメモリー破壊しています。

プログラムが正しいか確認してください。

id:okenji

やっぱりそういうことですかね。。

確認してみます。

ありがとうございます。

2009/11/12 01:11:49
id:hitoemon No.3

回答回数6ベストアンサー獲得回数1

ポイント35pt

【 nohup 】 ログアウトした後もコマンドを実行し続ける - Linuxコマンド集:ITpro

単にバックグラウンドで起動するのではなくて、nohupコマンドを使ってください。

直接ログインしているならばこれだけでいいと思います。

また、サーバーだとsshでリモートログインして使うこともあるでしょう。

そういうときは、標準出力、標準エラー出力、標準入力をリダイレクトしないと、サーバー側で終了されてしまうことがあります。

まとめると、

bashを使っている場合は

% nohup perl ./test.pl < /dev/null > /dev/null 2>&1 &

csh系を使っている場合は

% nohup perl ./test.pl < /dev/null >& /dev/null &

のようにすれば大丈夫だと思います。SSHの振る舞いについては下記URLに書いてあります(英語です)

http://www.snailbook.com/faq/background-jobs.auto.html]

id:okenji

具体的な対処方法をありがとうございます。

nohupというのを使うのですね。勉強になります。

今回はsshでログインした場合、直接ログインした場合も両方とも状況は同じです。

処理数が、3600件程度で終了することもあれば、15000件程度で終了することもあり、バラバラです。

200行くらいの単純なプログラムなんですけどね。。。長時間動かすにはいろいろあるのですね。

教えていただいたことをやってみます。ありがとうございました。

後日談:うーん、やってみました。多少長生きしたかな、と思いますが、やはり終了してしまいました。。ありがとうございました。

2009/11/15 21:13:24
id:b-wind No.4

回答回数3344ベストアンサー獲得回数440ここでベストアンサー

ポイント35pt

スクリプトがメモリー破壊しています。

いや、perl でそういうことやるのはむしろ難しいし、

その場合素直にコアはいて止まるよ。


基本的に perl の側ではメモリや実行時間の制限等は一切無い。

【 ulimit 】 コマンドに割り当てる資源を制限する - Linuxコマンド集:ITpro

ulimit 等でOS側で制限している可能性もあるが、

CPUの動作時間は毎回異なります。

ということなので可能性は低そう。


まさにprint文で書き込まれる一続きの単語の途中のアルファベット

というのが一番気になるところで、エラーがあったとしても一連の文字列の途中で

止まることはまれ。(perl に限らず出力がバッファリングされている場合)


ほかに計測データが無いので断言はしかねるが、純粋にディスク容量がいっぱいになるか

メモリを使い果たしたというのが一番想像しやすい現象ではある。

id:okenji

的確なご指摘ありがとうございます。

coreは見当たりません。スクリプトは終了していませんしね。

% ulimit

unlimited

でした。

「メモリや実行時間の制限等は一切無い」と断言いただいたので、可能性が絞れた分、嬉しいです。

topコマンドで追う限り、メモリがどんどん増えるようなことはなく、一定でした。(5時間全て見たわけではありませんが。)

いずれにしても、知識ある方の考察は有意義でした。ありがとうございました。

2009/11/13 21:37:40

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません