Your SlideShare is downloading. ×
実用裏方 Perl 入門
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

実用裏方 Perl 入門

3,543
views

Published on

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

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

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,543
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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
  • 4. 基礎知識編
    Hokkaido.pm #4
    用語とかを押えておこう
  • 5. バッチ処理で出てくる用語
    ジョブ
    小さな仕事の単位(1コマンドに対応)
    ジョブネット
    複数のジョブをまとめて制御して実行する単位
    ジョブ(ジョブネット)管理
    定期実行
    ログ出力
    メール通知
    ジョブネット作成
    Hokkaido.pm #4
  • 6. ジョブ管理システム
    ジョブ管理ができるもの
    cron… 最も単純で枯れている
    ジョブネット管理ができるもの
    JP1… 商用
    hinemos…NTTデータオープンソース
    他にもありますかね?
    Hokkaido.pm #4
  • 7. バッチ処理の種類 (1/3)
    削除系
    ログローテート/キャッシュ削除/セッション削除/その他不要ファイル削除/DBの古いデータ削除 などなど
    転送系
    プログラムの配備/リリースバッチ
    コンテンツ同期
    バックアップ
    Hokkaido.pm #4
  • 8. バッチ処理の種類 (2/3)
    交換系
    データ到着を監視して、ネット越しに情報を取得、フォーマットやエラーをチェックしてデータ形式を変換後、自システムに投入したり。
    変更系
    指定日になったら、とか特定の条件でステータスを変更するなど(来月の1日なったらコンテンツを公開するとか)
    Hokkaido.pm #4
  • 9. バッチ処理の種類 (3/3)
    集計系
    アクセスログ解析 (webalizer)
    自分が作ったことあるのはこれくらいですが、他にもありますかね?
    Hokkaido.pm #4
  • 10. 注意点
    大量データを処理することがある
    長時間稼動する
    メモリリーク
    想定時間内に終了しない
    負荷が高くなる
    メモリ、CPU使用量、IO負荷
    あと何かありますかね?
    Hokkaido.pm #4
  • 11. 実践編
    Hokkaido.pm #4
    削除バッチを作ってみよう
  • 12. 要件
    毎週日曜日、特定のフォルダ以下のファイルを削除する ( cron + find でOK)
    ファイル名の拡張子は、*.bak (cron + find でOK)
    ただし、消していいのは過去3時間以内に更新されていないファイルのみ (なんか find じゃだめっぽい)
    削除できたファイルを標準出力に、できなかったファイルを標準エラーに出力 (シェルスクリプトかな?)
    UNIXコマンドライクにオプション指定ができ、ヘルプも出てくる (なんかどんどん面倒になってきた)
    色々要件が膨らみそうな予感。(汎用的な言語で書いといた方がいいかな?)
    Hokkaido.pm #4
  • 13. モジュールを探す
    corelistを使うと標準モジュールを検索することができる
    find してくれるモジュールは?
    corelist –v 5.8.8 | egrep –i ‘file|find’
    オプション処理してくれるモジュールは?
    corelist –v 5.8.8 | egrep –i ‘opt’
    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 "削除対象のディレクトリ名を指定してください。n";
    pod2usage(2);
    }
    # 全bakファイルを取得して削除
    find( &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を削除できませんでした。n";
    return;
    }
    print "$fullpathを削除しました。n";
    }
    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
  • 17. テスト
    touch コマンドで、ファイルのアクセス時刻と修正時刻を変更できる
    touch –t MMDDhhmmファイル名
    例. hoge.txt の修正時刻を今年の2/10 10:30に変更
    touch –t 02101030 hoge.txt
    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
  • 20. ご清聴ありがとうございました
    Hokkaido.pm #4