Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

実用裏方 Perl 入門

4,334 views

Published on

標準モジュールで作るUNIXコマンドとバッチ処理

Published in: Technology
  • Be the first to comment

実用裏方 Perl 入門

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

×