タグ「Perl」の一覧

Perl:コマンドライン引数でつまずく

さっきまでPerlのスクリプトと格闘していてやっと問題が解決(?)したので、対処方法をメモしておきます。でも、まさかこんなことが起き得るんですね。

さて、その問題とはコマンドライン引数に改行文字が含まれるという問題。簡単にどんなシチュエーションでこの問題が起こったかを説明します。

まず、PCが2台あります。1つをPC_A、もう1つをPC_Bとします。
PC_A(WinXP 32bit)でPerlスクリプトとそれを何度も呼び出すシェルスクリプトを作成し、PC_B(WinXP 64bit)で実行します。そのプログラムの概要はだいたい以下の通り。
実行環境はCygwinで、Perlのバージョンは5.8.8(64bit)です。

#!/usr/bin/perl

my $a = $ARGV[0].".ext";
my $b = $ARGV[1].".ext";
my $c = $ARGV[2].".ext";

print system("java -jar jarfile.jar $a $b $c");

以下がシェルスクリプト*1です。(本当はこんな規則正しいパラメータの与え方をしているわけではありません。)

./perlscript.pl 10 10 10
./perlscript.pl 10 10 20
./perlscript.pl 10 10 30
# 以下同様...

./perlscript.pl 30 30 30

で、実行させようとすると、なぜかPerlスクリプトでの最後のコマンドライン引数がおかしなことになるのです。表示させてみると、どうやらcarriage returnが入っている模様。(表示が上書きされてたりするので。)

いろいろ試した結果、シェルスクリプトの行末に半角スペースを余分に入れることで対処。
でもこれまでこんな問題にぶつかったことがなかったので、かなり戸惑いました。

続きを読む

Perlでスレッドを使う

研究の都合で、Perlでスレッド使ったら早く処理が済むんじゃないかと思い立ちました。
もともと、実験の処理を行わせるスクリプトがPerlで書かれているというのもあるんですが、
あまり使い慣れてはないので、一瞬「スレッドをサポートしてるんかな?」とか思って
しまいました。でも、今さらそんなわけないですよね。

googleを使って調べてみると、簡単なサンプルが落ちていました。

[web] Perlでマルチスレッド - 結城浩

これってほとんどJavaと同じような感覚で使えますよね。
Javaなら、Runnableインターフェースを実装したクラスのインスタンスをThreadに与えて
runメソッドを呼び出して、joinメソッドでスレッドの終了を見届ける(?)ので、
それと置き換えて考えれば簡単に覚えられそうです。

以下がそのサンプルプログラムです。
(利用される場合は自己責任でどうぞw)

use strict;
use threads; 

my $thread1 = threads->new(\&main, "One");
my $thread2 = threads->new(\&main, "Two");

$thread1->join; 
$thread2->join; 

print "done.\n";

sub main {
    my ($name) = @_;
    for (1..10) {
        print "I am $name ($_)\n";
        threads->yield();
    }
}

Cygwin上でPerl+Javaを実行する

大学での研究を行うために、Cygwin上でPerlのスクリプトを実行することにしました。*2
これまではLinux上で動かすだけだったので、PerlからJavaプログラムを呼び出しても
全然問題なかったんですが、Cygwinになるとちょっと厄介な問題が発生します。

その問題というのは、PerlとJavaでパスの指定の仕方が異なるという点です。
Perlでは、よくCygwinでも使われている /cygdrive/c/(以下略) という形式で書くことができます。
また、スクリプトが存在する位置から見た相対パスでももちろん指定することができます。
しかし、このPerlスクリプトからJavaプログラムを呼び出した場合は、Windows形式で
直接指定しないといけません。(例えば、c:/Documents\ and\ Settings/hogehoge/ とか。)
なので、Perlスクリプト用のパスとJavaプログラム用のパスを別々に考えないといけないわけです。

ウェブ上を探してみると、Javaプログラムのためにパスを変換してくれるラッパー
アプリケーションがあるようなんですが、まだ試していません。
これがうまく動作するなら、とても便利そうなんですけどね。
なんとかならないんでしょうか、このCygwinの仕様。

やられる前に受け身をとれ!サーバ過負荷時の自動再起動

ここ最近、サーバが過負荷で処理効率が極端に落ちる現象が多発していました。効率が落ちるだけでサービスを提供してくれるならまだマシなんですが、それを通り越してSSHでログインできないこともしばしば…。家にいれば簡単に再起動できるんですけど、そうじゃなかったら長期間サーバが実質死亡状態で放置されることになってしまいます。

それを回避するために、過負荷で処理できなくなる前にさっさと再起動するようなスクリプトを書いてみました。まずはそのスクリプトを見てみてください。

#!/usr/bin/perl

$threshold = 50;

open( LOAD_AVERAGE, "</proc/loadavg" );
$value = <LOAD_AVERAGE>;
close( LOAD_AVERAGE );

$value =~ s/\..*//;

if( $value >= $threshold ) {
        print "I'm rebooting now!! [load average]$value";
        system("reboot");
}
exit;

これを、/etc/cron.hourly の中に放り込んで、rootの実行権限を追加すれば出来上がりです。でも、このソースはちょっと間違えるとえらいことになるので取扱注意です。*3

続きを読む

このページの上部へ

About

tetsuの日記・雑記です。
iPhoneなどのスマートフォン向けサイトもあります。スマートフォンでこのページを開くか、URLの最後に i を付けていただけばOKです

広告

サイト内検索

最近のピクチャ

  • リアディレーラ

月別アーカイブ

最近のコメント

Powered by Movable Type 7.5.0