過去に同じような目(寝る前に起動して、朝起きたら終わってるはずが、
半分くらいで止まってた・・・)にあった際に取った対応なので、
お役に立つかと思い回答させていただきます。
スクリプトとしては読みづらくなったり、駄々長くなったり、
perlの使いやすさを殺してるじゃないかと思う箇所があったりもしますが、
・再起呼び出しを減らす
・ifなどのネストを減らす
・ループを減らす
・1つのループで回る回数を減らす
・1つのループ内では極力簡単なコードだけとし、長大なコードを実行しないようにする
など改造してみてください。
同様なことで悩まれたとのことで、貴重なご意見ありがとうございます。
試してみます。
書き忘れたのですが、DBIモジュールでMysqlへのコネクションを開きっぱなしでsqlを投げまくっています。それがいけないのかな・・・
スクリプトがメモリー破壊しています。
プログラムが正しいか確認してください。
やっぱりそういうことですかね。。
確認してみます。
ありがとうございます。
【 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に書いてあります(英語です)
具体的な対処方法をありがとうございます。
nohupというのを使うのですね。勉強になります。
今回はsshでログインした場合、直接ログインした場合も両方とも状況は同じです。
処理数が、3600件程度で終了することもあれば、15000件程度で終了することもあり、バラバラです。
200行くらいの単純なプログラムなんですけどね。。。長時間動かすにはいろいろあるのですね。
教えていただいたことをやってみます。ありがとうございました。
後日談:うーん、やってみました。多少長生きしたかな、と思いますが、やはり終了してしまいました。。ありがとうございました。
▽4
●
b-wind ●35ポイント ![]() |
スクリプトがメモリー破壊しています。
いや、perl でそういうことやるのはむしろ難しいし、
その場合素直にコアはいて止まるよ。
基本的に perl の側ではメモリや実行時間の制限等は一切無い。
【 ulimit 】 コマンドに割り当てる資源を制限する - Linuxコマンド集:ITpro
ulimit 等でOS側で制限している可能性もあるが、
CPUの動作時間は毎回異なります。
ということなので可能性は低そう。
まさにprint文で書き込まれる一続きの単語の途中のアルファベット
というのが一番気になるところで、エラーがあったとしても一連の文字列の途中で
止まることはまれ。(perl に限らず出力がバッファリングされている場合)
ほかに計測データが無いので断言はしかねるが、純粋にディスク容量がいっぱいになるか
メモリを使い果たしたというのが一番想像しやすい現象ではある。
的確なご指摘ありがとうございます。
coreは見当たりません。スクリプトは終了していませんしね。
% ulimit
unlimited
でした。
「メモリや実行時間の制限等は一切無い」と断言いただいたので、可能性が絞れた分、嬉しいです。
topコマンドで追う限り、メモリがどんどん増えるようなことはなく、一定でした。(5時間全て見たわけではありませんが。)
いずれにしても、知識ある方の考察は有意義でした。ありがとうございました。