実用裏方 Perl 入門

4,236 views

Published on

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

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,236
On SlideShare
0
From Embeds
0
Number of Embeds
1,364
Actions
Shares
0
Downloads
8
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

実用裏方 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 />

×