Linux で、cron の設定方法

cron とはプログラムを自動実行するためのもの。 cron を設定するには,「crontab」と呼ばれるコマンドを利用する。オプションは次のようになっている。
crontab [-u user] { -l | -r | -e }

■オプション内容
-u	ユーザを指定する。省略時は現在のカレントユーザになる
-l	現在のcron設定を表示する
-r	現在のcron設定を削除する
-e	現在のcron設定を編集する。設定内容がない場合は新規作成する
crontab -e を実行し、記述する書式は次の通り。
$ crontab -e

# 0分ごとに実行する
0 * * * * [コマンド]

# 5分おきに実行する
*/5 * * * * [コマンド]

# 1日1回、0時0分に実行する
0 0 * * * [コマンド]

# 0 時から 23 時までの 2 時間おきに、毎 23 分ごとに実行する
23 0-23/2 * * * [コマンド]

# 1月と 12月それぞれの 1〜20 日、23 時 00分に実行する
* 23 1-20 1,12 * [コマンド]

# 日曜日(0)から土曜日(6)まで 1分おきに実行する
*/1 * * * 0-6 [コマンド]
日時を指定するために指定(ワイルドカード)が 5つ並んでいるが,それぞれの意味は次のようになっている。
* * * * * [コマンド]
1 2 3 4 5

■ 日時指定方法


 
左から何番目
単位
指定方法

 
1
分
0〜59、例:*/15


2
時
0〜23、例:0-23


3
日(月)
1から31、例:1-20


4
月
1〜12 (or names)、例:1,6,12

 
5
日曜〜土曜
0〜6、例:0-6


cron とはプログラムを自動実行するためのもの。 cron を設定するには,「crontab」と呼ばれるコマンドを利用する。オプションは次のようになっている。
crontab [-u user] { -l | -r | -e }

■オプション内容
-u	ユーザを指定する。省略時は現在のカレントユーザになる
-l	現在のcron設定を表示する
-r	現在のcron設定を削除する
-e	現在のcron設定を編集する。設定内容がない場合は新規作成する
crontab -e を実行し、記述する書式は次の通り。
$ crontab -e

# 0分ごとに実行する
0 * * * * [コマンド]

# 5分おきに実行する
*/5 * * * * [コマンド]

# 1日1回、0時0分に実行する
0 0 * * * [コマンド]

# 0 時から 23 時までの 2 時間おきに、毎 23 分ごとに実行する
23 0-23/2 * * * [コマンド]

# 1月と 12月それぞれの 1〜20 日、23 時 00分に実行する
* 23 1-20 1,12 * [コマンド]

# 日曜日(0)から土曜日(6)まで 1分おきに実行する
*/1 * * * 0-6 [コマンド]
日時を指定するために指定(ワイルドカード)が 5つ並んでいるが,それぞれの意味は次のようになっている。
* * * * * [コマンド]
1 2 3 4 5

■ 日時指定方法


 
左から何番目
単位
指定方法

 
1
分
0〜59、例:*/15


2
時
0〜23、例:0-23


3
日(月)
1から31、例:1-20


4
月
1〜12 (or names)、例:1,6,12

 
5
日曜〜土曜
0〜6、例:0-6


Perl で、アップロードしたファイルを処理する

Perl の場合は、CGI として動作させる場合は、必ず
print qq|Content-type: text/html\n\n|;
という行が必要な以外は、PHP とほとんど同じである。 アップロードには、いつも使っているおなじみの CGI モジュールを使う。
use CGI;
そうすると、以下のようにアクセスできる。
our $CGI = new CGI;
...
my $xml = $CGI->param('file');
$xml はファイルポインタが入っている。通常は open(IN, "..."); などするときの IN にあたるものである。以下は、コード。アップロードする側の HTML ファイルは PHP でアップロードファイルを処理するで紹介したのと同じ。
#!/usr/bin/perl

use strict;
use CGI;

our $CGI = new CGI;

print qq|Content-type: text/html\n\n|;
init();

sub init() {

    # XMLパーサー作成 ('UTF-8')
    my $xml_parser = new XML::Parser(    ProtocolEncoding => 'UTF-8',
                                        Handlers=>{    Start=>\&startElement,
                                                    End  =>\&endElement,
                                                    Char =>\&dataHandler    });
    # ファイルのオープンはいらない。input タグで指定した name 属性がそのままファイルハンドルになる
    my $xml = $CGI->param('file');

    # XMLパース処理
    $xml_parser->parse($xml) or    die "XML error: $xml_parser";

    # ファイルクローズ
    close($xml);
}

1;
Perl の場合は、CGI として動作させる場合は、必ず
print qq|Content-type: text/html\n\n|;
という行が必要な以外は、PHP とほとんど同じである。 アップロードには、いつも使っているおなじみの CGI モジュールを使う。
use CGI;
そうすると、以下のようにアクセスできる。
our $CGI = new CGI;
...
my $xml = $CGI->param('file');
$xml はファイルポインタが入っている。通常は open(IN, "..."); などするときの IN にあたるものである。以下は、コード。アップロードする側の HTML ファイルは PHP でアップロードファイルを処理するで紹介したのと同じ。
#!/usr/bin/perl

use strict;
use CGI;

our $CGI = new CGI;

print qq|Content-type: text/html\n\n|;
init();

sub init() {

    # XMLパーサー作成 ('UTF-8')
    my $xml_parser = new XML::Parser(    ProtocolEncoding => 'UTF-8',
                                        Handlers=>{    Start=>\&startElement,
                                                    End  =>\&endElement,
                                                    Char =>\&dataHandler    });
    # ファイルのオープンはいらない。input タグで指定した name 属性がそのままファイルハンドルになる
    my $xml = $CGI->param('file');

    # XMLパース処理
    $xml_parser->parse($xml) or    die "XML error: $xml_parser";

    # ファイルクローズ
    close($xml);
}

1;

PHP で、アップロードしたファイルを処理する

まず、アップロードする側の HTML は以下のようになる。特に、
<form enctype="multipart/form-data"...>
<input type="file" name="file" /&gt
の指定が必要となる。ここで input type="file" name="file" となっている name 属性のところに書いてある値 (この場合は file) が、サーバ側で利用される。
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  </head>
  <body>
<!--
    <form enctype="multipart/form-data" action="gmap_excel.php" method="post">
-->
    <form enctype="multipart/form-data" action="gmap_excel.cgi" method="post">
      <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
      <table width="600">
        <tr><td>Names file:</td><td><input type="file" name="file" /><input type="submit" value="Upload" /></td></tr>
      </table>
    </form>
  </body>
</html>
サーバ側の PHP は以下の通り (例として、アップロードするファイルは XML としている)。肝心なのは、以下の3行である。
<?php

// ファイルのオープン
$fp = fopen($_FILES['file']['tmp_name'], 'r')
or die(
'Cannot open an XML file: ' . $_FILES['file']['tmp_name']);

// ファイルを読み込む
while ($data = fread($fp, 4096)) {
...
}

?>
<?php

init
();

function
init() {

 
// XMLパーサー作成 ('UTF-8')
 
$xml_parser = xml_parser_create('UTF-8');

 
// 大文字変換を行わない
 
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);

 
// start および end 要素のハンドラを設定する
 
xml_set_element_handler($xml_parser, 'startElement', 'endElement');
 
xml_set_character_data_handler($xml_parser, 'characterData');

 
// ファイルのオープン
 
$fp = fopen($_FILES['file']['tmp_name'], 'r')
  or die(
'Cannot open an XML file: ' . $_FILES['file']['tmp_name']);

 
// ファイルを読み込む
 
while ($data = fread($fp, 4096)) {

   
// XMLパース処理
   
if (!xml_parse($xml_parser, $data, feof($fp))) {

     
// パースエラー処理
     
die(sprintf("XML error: %s at line %d",
       
xml_error_string(xml_get_error_code($xml_parser)),
       
xml_get_current_line_number($xml_parser)));
    }
  }

 
// XMLパーサの開放
 
xml_parser_free($xml_parser);
}

?>
まず、アップロードする側の HTML は以下のようになる。特に、
<form enctype="multipart/form-data"...>
<input type="file" name="file" /&gt
の指定が必要となる。ここで input type="file" name="file" となっている name 属性のところに書いてある値 (この場合は file) が、サーバ側で利用される。
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  </head>
  <body>
<!--
    <form enctype="multipart/form-data" action="gmap_excel.php" method="post">
-->
    <form enctype="multipart/form-data" action="gmap_excel.cgi" method="post">
      <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
      <table width="600">
        <tr><td>Names file:</td><td><input type="file" name="file" /><input type="submit" value="Upload" /></td></tr>
      </table>
    </form>
  </body>
</html>
サーバ側の PHP は以下の通り (例として、アップロードするファイルは XML としている)。肝心なのは、以下の3行である。
<?php

// ファイルのオープン
$fp = fopen($_FILES['file']['tmp_name'], 'r')
or die(
'Cannot open an XML file: ' . $_FILES['file']['tmp_name']);

// ファイルを読み込む
while ($data = fread($fp, 4096)) {
...
}

?>
<?php

init
();

function
init() {

 
// XMLパーサー作成 ('UTF-8')
 
$xml_parser = xml_parser_create('UTF-8');

 
// 大文字変換を行わない
 
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);

 
// start および end 要素のハンドラを設定する
 
xml_set_element_handler($xml_parser, 'startElement', 'endElement');
 
xml_set_character_data_handler($xml_parser, 'characterData');

 
// ファイルのオープン
 
$fp = fopen($_FILES['file']['tmp_name'], 'r')
  or die(
'Cannot open an XML file: ' . $_FILES['file']['tmp_name']);

 
// ファイルを読み込む
 
while ($data = fread($fp, 4096)) {

   
// XMLパース処理
   
if (!xml_parse($xml_parser, $data, feof($fp))) {

     
// パースエラー処理
     
die(sprintf("XML error: %s at line %d",
       
xml_error_string(xml_get_error_code($xml_parser)),
       
xml_get_current_line_number($xml_parser)));
    }
  }

 
// XMLパーサの開放
 
xml_parser_free($xml_parser);
}

?>
Posted on 2005-11-25 by yas |

Perl で、HTML 文書中にあるリンクを置換する

以下は、HTML 文書中にあるリンクを任意の文字列に置換するスクリプトであるが、他のタグでもいろいろと応用が利くと思われる。
#!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Status;
use HTTP::Response;

our $URL = 'https://perltips.twinkle.cc/'; # アクセスする URL

my $proxy = new LWP::UserAgent;
$proxy->agent('your own created browser name here');
$proxy->timeout(60);

my $response = $proxy->request(HTTP::Request->new('GET' => $URL));
my $content = $response->content;

my %tags = (

    'img'  => 'src',
    'a'    => 'href',
    'link' => 'href',
    'td'   => 'background',
    'form' => 'action'
);

my $data = $content;

skip_others: while($data =~ s/<([^>]*)>// && $i++ < 10000) { # 無限ループに陥るのを防ぐ

    my $in_brackets = $1;

    foreach $key (keys %tags) {

        if($in_brackets =~ /^\s*$key\s+/i) {

            if($in_brackets =~ /\s+$tags{$key}\s*=\s*["']([^"']*)["']/i
            || $in_brackets =~ /\s+$tags{$key}\s*=\s*([^\s]+)/i        ) {

                my $link =  $1;

                $link =~ s/[\n\r]//g;
                $link =~ s/\./\\./g;
                $link =~ s/\?/\\?/g;

                $content    =~
                    s/\s*=\s*["']*$link["']*/=<<<ここに置換文字列を書く>>>/
                    if $link !~ m/mailto:/i
                    && $link !~ m/javascript/i;

                next skip_others;
            }
        }
    }
}

1;
以下は、HTML 文書中にあるリンクを任意の文字列に置換するスクリプトであるが、他のタグでもいろいろと応用が利くと思われる。
#!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Status;
use HTTP::Response;

our $URL = 'https://perltips.twinkle.cc/'; # アクセスする URL

my $proxy = new LWP::UserAgent;
$proxy->agent('your own created browser name here');
$proxy->timeout(60);

my $response = $proxy->request(HTTP::Request->new('GET' => $URL));
my $content = $response->content;

my %tags = (

    'img'  => 'src',
    'a'    => 'href',
    'link' => 'href',
    'td'   => 'background',
    'form' => 'action'
);

my $data = $content;

skip_others: while($data =~ s/<([^>]*)>// && $i++ < 10000) { # 無限ループに陥るのを防ぐ

    my $in_brackets = $1;

    foreach $key (keys %tags) {

        if($in_brackets =~ /^\s*$key\s+/i) {

            if($in_brackets =~ /\s+$tags{$key}\s*=\s*["']([^"']*)["']/i
            || $in_brackets =~ /\s+$tags{$key}\s*=\s*([^\s]+)/i        ) {

                my $link =  $1;

                $link =~ s/[\n\r]//g;
                $link =~ s/\./\\./g;
                $link =~ s/\?/\\?/g;

                $content    =~
                    s/\s*=\s*["']*$link["']*/=<<<ここに置換文字列を書く>>>/
                    if $link !~ m/mailto:/i
                    && $link !~ m/javascript/i;

                next skip_others;
            }
        }
    }
}

1;