Weitere ähnliche Inhalte
Ähnlich wie 実用裏方 Perl 入門 (20)
Kürzlich hochgeladen (12)
実用裏方 Perl 入門
- 1. 実用裏方 Perl 入門 標準モジュールで作るUNIXコマンドとバッチ処理 keroyonn / Hokkaido.pm Hokkaido.pm #4
- 2. 自己紹介 ちょっとずつ違う素敵なID達 cpan : keroyonhttp://search.cpan.org/~keroyon/ github : keroyonnhttp://github.com/keroyonn twitter : keroyonn_http://twitter.com/keroyonn_ hatena :keroyon0630http://d.hatena.ne.jp/keroyon0630 Hokkaido.pm #4
- 3. 今回のお題 面倒な作業を、 コマンドを作って、 バッチ処理にしよう オンラインシステムの裏で地味な運用業務があります。 いらないファイルを消したり、アクセスログ集計したり、システムのバージョンアップしたり、対向システムからFTP投稿されたデータをシステムに投入したり。 手作業でもできるけど面倒臭すぎる、そんな業務の数々を標準モジュールのみで作れると楽。 萌えやポロリはありません!! Hokkaido.pm #4
- 7. バッチ処理の種類 (1/3) 削除系 ログローテート/キャッシュ削除/セッション削除/その他不要ファイル削除/DBの古いデータ削除 などなど 転送系 プログラムの配備/リリースバッチ コンテンツ同期 バックアップ Hokkaido.pm #4
- 8. バッチ処理の種類 (2/3) 交換系 データ到着を監視して、ネット越しに情報を取得、フォーマットやエラーをチェックしてデータ形式を変換後、自システムに投入したり。 変更系 指定日になったら、とか特定の条件でステータスを変更するなど(来月の1日なったらコンテンツを公開するとか) Hokkaido.pm #4
- 12. 要件 毎週日曜日、特定のフォルダ以下のファイルを削除する ( cron + find でOK) ファイル名の拡張子は、*.bak (cron + find でOK) ただし、消していいのは過去3時間以内に更新されていないファイルのみ (なんか find じゃだめっぽい) 削除できたファイルを標準出力に、できなかったファイルを標準エラーに出力 (シェルスクリプトかな?) UNIXコマンドライクにオプション指定ができ、ヘルプも出てくる (なんかどんどん面倒になってきた) 色々要件が膨らみそうな予感。(汎用的な言語で書いといた方がいいかな?) Hokkaido.pm #4
- 14. ソースコード (1/3) 端折り過ぎなのでそのまま使うと危険!! #!/usr/bin/perl use 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 "削除対象のディレクトリ名を指定してください。"; pod2usage(2); } # 全bakファイルを取得して削除 find( amp;delete_files, $base_dir ); Hokkaido.pm #4
- 15. ソースコード (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を削除できませんでした。"; return; } print "$fullpathを削除しました。"; } Hokkaido.pm #4
- 16. ソースコード (3/3) __END__ =encoding utf-8 =head1 NAME delete_backup_files - 過去n時間以内に更新されなかったバックアップファイルを除外する =head1 SYNOPSIS delete_backup_files [options] directory_name Options: --mtime=n 過去n時間以内に更新されなかったバックアップファイルを除外する。デフォルト 6 時間 Hokkaido.pm #4
- 18. ジョブを登録する crontab –e 分 時 日 月 曜日 ** * * *コマンドのフルパス 30 3 * * 0 /home/hogehoge/delete_backup_files 例. 毎月1日の3時30分にコマンドを実行 3031 * * コマンド 毎週日曜日に毎分コマンドを実行 * * * * 0 コマンド とにかく毎分実行する * * * * * コマンド Hokkaido.pm #4
- 19. まとめ Perl は Linux に標準インストールなので、標準モジュールだけ使って作ればシェルスクリプトと同じ感覚で配布できる。なのでコマンドは、Perl で作った方が楽 -> corelist (Module::CoreList) メモリリークなどに気をつける必要がある -> Devel::Leak::Object 性能の要件を満す必要がある -> Devel::NYTProf Hokkaido.pm #4