maco's life

主にエンジニアリングと読書について書いていきます。

安心してスクリプトを実行したい Script::Nohupの紹介

この記事はPerl Advent Calendar 2014 - Qiitaの13日目の記事です。 12日目の記事はzoncoen さんの Plagger 入門 in 2014 でした!


Perl書き始めてもうすぐ2年目。

まだまだ若輩者ですがそろそろ便利モジュールを作ってもいいのでは!?っておもって Perl Advent Calender駆動で前々から作りたいなー思っていたモジュールをつくりました!

Script::Nohup

名前の通りscriptをnohupで実行したかのような挙動にするモジュールです。

使い方は簡単。実行したいperl scriptでuseするだけです!

hoge.plなんかで

#!/usr/bin/env perl
use 5.16.1;
use utf8;
use Script::Nohup;

...//何らかの処理

1;

のような感じ使えます。本当にただuseするだけですね(╹◡╹)

実行中に吐かれるログは、{スクリプト名}_{日付}.logといった名前のファイルが作成されて、そこに出力されます。


本番反映時の手順書でnohup perl hoge.pl &のようなことを書くことが結構あって、nohupする必要があるスクリプトかどうか都度気にするの不安だなーと思っていました。

そこで、いっそモジュールにすればいいのでは?と考え作った次第です。(tmuxとかscreen使えばいいんじゃないという話もありますが)

実装

実装的には

# lib/Script/Nohup.pm
...

sub import {
    my $pkg = shift;

    $pkg->_fork;

    my $script_nohup = $pkg->new(@_);

    $SIG{HUP} = 'IGNORE';
    print "start  : ".$script_nohup->basename."\n";
    print "create : ".$script_nohup->filename."\n";

    $script_nohup->_logger();
}

sub _fork {
    my $pid = fork();
    die "can't fork: $!" unless defined $pid;
    exit 0 if $pid;
    setsid();
}

...

1;

みたいなコードになっていて、useした時にforkして親プロセスを終了させ 子プロセスをプロセスリーダーにして、HUPを受け付けないようにするみたいなつくりになっています。

デモ

f:id:Maco_Tasu:20141213213504g:plain

最後に

もしかして既にこういったモジュールがあるのかしれませんが、思い立ったが吉日と思い作りました!

ブログのタイトルは安心してスクリプトを実行したいですが、まだ作ったばかりで安心して実行できません。バグなどありましたら、教えていただけると大変嬉しいです!

明日

Perl Advent Calendar 2014 - Qiitaの14日目は karupanerura さんです! 楽しみですね!!