実用裏方 Perl 入門標準モジュールで作るUNIXコマンドとバッチ処理keroyonn / Hokkaido.pmHokkaido.pm #4
自己紹介ちょっとずつ違う素敵なID達cpan	: keroyonhttp://search.cpan.org/~keroyon/github	: keroyonnhttp://github.com/keroyonntwitter	: keroyonn_http://twitter.com/keroyonn_hatena	:keroyon0630http://d.hatena.ne.jp/keroyon0630Hokkaido.pm #4
今回のお題面倒な作業を、コマンドを作って、バッチ処理にしようオンラインシステムの裏で地味な運用業務があります。いらないファイルを消したり、アクセスログ集計したり、システムのバージョンアップしたり、対向システムからFTP投稿されたデータをシステムに投入したり。手作業でもできるけど面倒臭すぎる、そんな業務の数々を標準モジュールのみで作れると楽。萌えやポロリはありません!!Hokkaido.pm #4
基礎知識編Hokkaido.pm #4用語とかを押えておこう
バッチ処理で出てくる用語ジョブ小さな仕事の単位(1コマンドに対応)ジョブネット複数のジョブをまとめて制御して実行する単位ジョブ(ジョブネット)管理定期実行ログ出力メール通知ジョブネット作成Hokkaido.pm #4
ジョブ管理システムジョブ管理ができるものcron… 最も単純で枯れているジョブネット管理ができるものJP1… 商用hinemos…NTTデータオープンソース他にもありますかね?Hokkaido.pm #4
バッチ処理の種類 (1/3)削除系ログローテート/キャッシュ削除/セッション削除/その他不要ファイル削除/DBの古いデータ削除 などなど転送系プログラムの配備/リリースバッチコンテンツ同期バックアップHokkaido.pm #4
バッチ処理の種類 (2/3)交換系データ到着を監視して、ネット越しに情報を取得、フォーマットやエラーをチェックしてデータ形式を変換後、自システムに投入したり。変更系指定日になったら、とか特定の条件でステータスを変更するなど(来月の1日なったらコンテンツを公開するとか)Hokkaido.pm #4
バッチ処理の種類 (3/3)集計系アクセスログ解析 (webalizer)自分が作ったことあるのはこれくらいですが、他にもありますかね?Hokkaido.pm #4
注意点大量データを処理することがある長時間稼動するメモリリーク想定時間内に終了しない負荷が高くなるメモリ、CPU使用量、IO負荷あと何かありますかね?Hokkaido.pm #4
実践編Hokkaido.pm #4削除バッチを作ってみよう
要件毎週日曜日、特定のフォルダ以下のファイルを削除する ( cron + find でOK)ファイル名の拡張子は、*.bak (cron + find でOK)ただし、消していいのは過去3時間以内に更新されていないファイルのみ (なんか find じゃだめっぽい)削除できたファイルを標準出力に、できなかったファイルを標準エラーに出力 (シェルスクリプトかな?)UNIXコマンドライクにオプション指定ができ、ヘルプも出てくる (なんかどんどん面倒になってきた)色々要件が膨らみそうな予感。(汎用的な言語で書いといた方がいいかな?)Hokkaido.pm #4
モジュールを探すcorelistを使うと標準モジュールを検索することができるfind してくれるモジュールは?corelist –v 5.8.8 | egrep –i ‘file|find’オプション処理してくれるモジュールは?corelist –v 5.8.8 | egrep –i ‘opt’Hokkaido.pm #4
ソースコード (1/3)端折り過ぎなのでそのまま使うと危険!!#!/usr/bin/perluse warnings;use strict;use utf8;use Getopt::Long;use Pod::Usage;use File::Find;use File::stat;BEGIN { binmode STDOUT, ':utf8‘; }# コマンドオプションの解析my $modified_time = 6;GetOptions( 'mtime=i' => \$modified_time, ) or pod2usage(2);my $base_dir = shift @ARGV;if ( !defined $base_dir ) {    print "削除対象のディレクトリ名を指定してください。\n";    pod2usage(2);}# 全bakファイルを取得して削除find( \&delete_files, $base_dir );Hokkaido.pm #4
ソースコード (2/3)sub delete_files {    my $fullpath = $File::Find::name;    my $filename = $_;    # bak以外ならスキップreturn if $filename !~ m{\.bak$}xms;    # n 時間以内に更新されたファイルを除外my $stat  = stat($fullpath);    my $mtime = $stat->mtime;    return if $mtime + $modified_time * 3600 > time;    # 削除my $ret = unlink $fullpath;    if ( $ret < 1 ) {        print STDERR "$fullpathを削除できませんでした。\n";        return;    }    print "$fullpathを削除しました。\n";}Hokkaido.pm #4
ソースコード (3/3)__END__=encoding utf-8=head1 NAMEdelete_backup_files - 過去n時間以内に更新されなかったバックアップファイルを除外する=head1 SYNOPSISdelete_backup_files [options] directory_name  Options:    --mtime=n 過去n時間以内に更新されなかったバックアップファイルを除外する。デフォルト 6 時間Hokkaido.pm #4
テストtouch コマンドで、ファイルのアクセス時刻と修正時刻を変更できるtouch –t MMDDhhmmファイル名例. hoge.txt の修正時刻を今年の2/10 10:30に変更touch –t 02101030 hoge.txtHokkaido.pm #4
ジョブを登録するcrontab –e分 時 日 月 曜日** * *   *コマンドのフルパス30  3  *  *  0 /home/hogehoge/delete_backup_files例. 毎月1日の3時30分にコマンドを実行3031  *  * コマンド毎週日曜日に毎分コマンドを実行* * * * 0 コマンドとにかく毎分実行する* * * * * コマンドHokkaido.pm #4
まとめPerl は Linux に標準インストールなので、標準モジュールだけ使って作ればシェルスクリプトと同じ感覚で配布できる。なのでコマンドは、Perl で作った方が楽-> corelist (Module::CoreList)メモリリークなどに気をつける必要がある-> Devel::Leak::Object性能の要件を満す必要がある-> Devel::NYTProfHokkaido.pm #4
ご清聴ありがとうございましたHokkaido.pm #4

実用裏方 Perl 入門