この記事は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を受け付けないようにするみたいなつくりになっています。
デモ
最後に
もしかして既にこういったモジュールがあるのかしれませんが、思い立ったが吉日と思い作りました!
ブログのタイトルは安心してスクリプトを実行したい
ですが、まだ作ったばかりで安心して実行できません。バグなどありましたら、教えていただけると大変嬉しいです!
明日
Perl Advent Calendar 2014 - Qiitaの14日目は karupanerura さんです! 楽しみですね!!