crontab を秒単位で設定する方法(15秒, 30秒など)

Posted by admin | CentOS, Linux, PHP, サーバー管理 | 木曜日 4 3月 2010 2:52 PM

crontab は1分単位までの指定しかできませんが、下記のようにすれば、一応秒単位で動作させることも可能らしいです。

15秒ごとにスクリプトを動かす crontab 設定

* * * * * /usr/bin/php hoge.php & sleep 15; /usr/bin/php hoge.php;



21時から翌3時まで、30秒ごとにスクリプトを動かす crontab 設定

* 21-3 * * * /usr/bin/php hoge.php & sleep 30; /usr/bin/php hoge.php;



参考:http://d.hatena.ne.jp/kasahi/20090126/1232983646





無くなって初めて気づく定期的自動バックアップの大切さ

Posted by admin | MySQL, PostgreSQL, サーバー管理 | 金曜日 23 5月 2008 3:16 PM

という事で、約40分で理解する定期的自動バックアップ方法のメモです。

参考url:
http://www.hyperdyne.co.jp/~oohashi/work/redhat/etc/remotebackup.shtml

今回はpostgresqlを例にしてみます。

なにをやるかですが、

  1. 遠く離れたLinuxマシン上で、自動的にデータを定期的に圧縮・保管する
  2. 圧縮は、週1回はフルで行ない、差分(追加・修正されたファイルのみ。削除されたファイルは反映されない)だけを毎日とる
  3. 手元にあるLinuxマシンが自動的にFTPでログインし、圧縮・保管されているファイルを毎日ゲットする
です。


1.の定期的にバックアップする

まず遠く離れたところにあるLinuxマシンで、データを定期的に圧縮・保管するようにします。ここでは、システム全体のバックアップは行なわず、データ のバックアップだけを行なうようにとどめ、バックアップにあたっては、ユーザのディレクトリごとに行ない、週1回そのフルバックアップを行ない、そのうち変 更・追加されたファイルのバックアップを毎日行なうようにします。

バックアップはシェルスクリプトを使い、cronによって自動的に行ないます。まずシェルスクリプト「dailybackup.sh」を、次の内容で記述します。

#!/bin/sh
set `date +%y%m%d`
cd /var/www
find html/ -mtime 1 \! -type d -print > /var/backup/html$1.txt
if test -s /var/backup/html$1.txt
then
tar zcvf /var/backup/html$1.tar.gz -T /var/backup/html$1.txt
fi
cd /home
find webmaster/ -mtime 1 \! -type d -print > /var/backup/webmaster$1.txt
if test -s /var/backup/webmaster$1.txt
then
tar zcvf /var/backup/webmaster$1.tar.gz -T /var/backup/webmaster$1.txt
fi
su -l postgres -c '/usr/bin/pg_dump database_1 > database_1.dump'
mv /var/lib/pgsql/database_1.dump /var/backup/database_1$1.dump
set `date --date '1 days ago' '+%y%m%d'`
rm -f /var/backup/*$1.txt
rm -f /var/backup/*$1.tar.gz
rm -f /var/backup/*$1.dump

ここでは、バックアップしたデータを格納するディレクトリを「/var/backup」としています。「/var/backup」のオーナーは「root」ですが、バックアップファイルをあとでFTPでゲットできるよう「webmaster」を例えば「webmaster」というようなグループに所属させ、そのグループにも読み書き・削除できる権限を与えておく必要があります。「chmod 770」です。

# ls -la
合計 74
drwxr-xr-x   27 root     root         4096 May  8 12:17 .
drwxr-xr-x   17 root     root         1024 Feb 17 04:15 ..
drwxrwx---    2 root     webmaster    8192 Jun 19 15:41 backup

シェルスクリプトなので先頭に「#!/bin/sh」が必要です。2行目の「set `date +%y%m%d`」は、dateコマンドから「010621」(2001年6月21日)というパラメータを作るためのもので、「$1」がこのパラメータに置き換わります。

「cd /var/www」でバックアップしたいディレクトリのひとつ上に移動します。「find html/ -mtime 1 \! -type d -print > /var/backup/html$1.txt」は、findコマンドで1日(24時間)以内に修正・追加されたファイルをリストアップします。リス トアップされたファイルリストは「html010618.txt」のように日付「010608」が付いたファイル名で保存されます。

findコマンドでは、「find <検索を開始するディレクトリ> <検索の条件> <コマンド>」という書式になります。


if test -s /var/backup/html$1.txt
then
tar zcvf /var/backup/html$1.tar.gz -T /var/backup/html$1.txt
fi

「if」文で分岐処理しています。先に実行するfindコマンドでは、変更・追加がなくてもファイルが作られるため、testコマンドを使ってそのファイルが空かどうかをチェックします。空でない場合、そのファイルリストをもとにtarコマンドで、リストにあるファイルを圧縮します。


su -l postgres -c '/usr/bin/pg_dump database_1 > database_1.dump'
mv /var/lib/pgsql/database_1.dump /var/backup/database_1$1.dump

は、PostgreSQLのデータベースをバックアップしています。


set `date --date '1 days ago' '+%y%m%d'`
rm -f /var/backup/*$1.txt
rm -f /var/backup/*$1.tar.gz
rm -f /var/backup/*$1.dump

は、前日の不要なファイルを削除するステップです。「set `date –date ‘1 days ago’ ‘+%y%m%d’`」で1日前を「010617」のようなパラメータとし、rmコマンドで不要なファイルを削除しています(daysはdayという単数形でもいいようです)。


以上のような内容のシェルスクリプトを作ったら、オーナーrootで「chmod 700」として実行権を与えておきます。スクリプトに誤りがないか確認したら、実行して動作を確認します。
実行して動作に問題が無ければ最後に、「/etc/crontab」に登録します。

30 4 * * * root /var/backup/dailybackup.sh > /dev/null 2 >&1

毎日明け方4時30分にスクリプト「dailybackup.sh」が実行されます。

同様にして「weeklybackup.sh」という名前のシェルスクリプトを次の内容で作ります。

#!/bin/sh
set `date +%y%m%d`
cd /var/www
tar zcvf /var/backup/html$1.full.tar.gz ./html/*
cd /home
tar zcvf /var/backup/webmaster$1.full.tar.gz ./webmaster/*
set `date --date '1 weeks ago' '+%y%m%d'`
rm -f /var/backup/*$1.full.tar.gz

dailybackup.shとほとんど同じ内容ですが、「なんとか+日付.full.tar.gz」という日付付きの名前で圧縮ファイルを作るようになります。rmコマンド行は、1週間前の不要なファイルを削除するステップです。「set `date –date ‘1 weeks ago’ ‘+%y%m%d’`」で1週間を「010617」のようなパラメータとし、rmコマンドで不要なファイルを削除しています(weeksはweekという単数形でもいいようです)。

dailybackup.shと同じように「/etc/crontab」に登録します。

50 4 * * 0 root /var/backup/weeklybackup.sh > /dev/null 2 >&1




3.のリモートマシンからFTPでバックアップファイルをゲットする

次に近くにあるLinuxマシンから自動的にリモートサーバにFTPでファイルをゲットする仕組みを作ります。まず次のような内容のシェルスクリプト(たとえば、「remote.sh」というような名前で)を作ります。

#!/bin/sh
cd /usr/bin
ftp -n < /home/xxxxxxx/login.www

「/usr/bin」ディレクトリにあるftpコマンドを使っています。続いて「/home/xxxxxxx」ディレクトリに「login.www」というような名前のファイルを作り、次のようなftpコマンドを記述しておきます。

open www.hyperdyne.co.jp
user webmaster xxxxxxxxxxxx
idle 600
prompt
hash
lcd /home/xxxxxxxx/www/
cd /var/backup
bin
mget *.tar.gz
ascii
mget *.dump


openコマンドでサーバを指定し、そのあとでuserコマンドでユーザ名とパスワードを渡しています。「xxxxxxxxxxxx」となっているところにパスワードが入ります。FTPではテキストでパスワードが流れてしまいます。lcdはlocal側のcd(Change Directory)です。ローカル側とリモート側でディレクトリを移動してからmgetコマンドで複数のファイルをgetします。

getするときには、バイナリファイルに対しては「bin」を、テキストファイルには「ascii」をあらかじめ実行しておきます。「hash」は進行状況を表示するコマンドです。実際に運用するときは不要です。

作ったシェルスクリプトを実行させてみてうまく動作するようでしたら、cronに登録しておきます。
以上です。お疲れ様でした。





アクセス解析「AWStats日本語版」のインストール方法メモ その2

Posted by admin | Perl, アクセス解析 | 月曜日 21 4月 2008 4:25 PM

アクセス解析「AWStats日本語版」のインストール方法メモ その2

その1はこちら

  1. Apache の設定
  2. まず、Apache のログファイル名とログ形式を設定します。ファイル名は必ず「ホスト名-access_log」とし、形式は combined にしてください。

    バーチャルホストを使用していない場合


    # vi /etc/httpd/conf/httpd.conf


    CustomLog logs/access_log combined env=!no_log

    CustomLog logs/blog.96q.org-access_log combined

    バーチャルホストを使用している場合


    # vi /etc/httpd/conf.d/virtualhost.conf


    <VirtualHost *:80>
    ServerName blog.96q.org
    :
    CustomLog logs/blog.96q.org-access_log combined ←ログをこのように指定
    </VirtualHost>

    Web から AWStats のレポートにアクセスできるように設定します。


    # vi /etc/httpd/conf.d/awstats.conf


    #
    # Directives to allow use of AWStats as a CGI
    #
    Alias /classes "/usr/local/awstats/wwwroot/classes/"
    Alias /icon "/usr/local/awstats/wwwroot/icon"
    ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"


    #
    # This is to permit URL access to scripts/files in AWStats directory.
    #
    <Directory “/usr/local/awstats/wwwroot”>
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>

    Apache に設定を反映します。


    # /etc/init.d/httpd reload

  3. ログ集計の設定
  4. AWStats 完全日本語版では、オリジナルの AWStats とは違い、一度 Web サーバのログを UTF-8 変換するスクリプトを通してから集計する必要があります(でないと『完全』日本語版にはならなくなる)。

    まず、UTF-8 変換スクリプトを自分の環境に合わせて修正します。


    # vi /usr/local/awstats/wwwroot/cgi-bin/utf8_decode.pl


    $Myhost = "bflets\.dyndns\.org"; # 自ホストのchcheかの判定用.

    $Myhost = "96q\.org"; # 自ホストのchcheかの判定用. ←自分のドメイン名に変更する

    次に Apache のログを UTF-8 変換スクリプトに通し、AWStats に集計させるスクリプトを作成します。


    # vi /usr/local/bin/awstats-update

    #!/usr/bin/env ruby
    
    CONF = "/etc/awstats"
    LOG_DIR = "/var/log/httpd"
    TMP_DIR = "/tmp/hl"
    UTF8_DECODE = "/usr/local/awstats/wwwroot/cgi-bin/utf8_decode.pl"
    AWSTATS = "/usr/local/awstats/wwwroot/cgi-bin/awstats.pl"
    
    Dir.mkdir(TMP_DIR, 0700)
    begin
      Dir.glob(CONF + "/*") do |var|
        if File.basename(var, ".conf") =~ /awstats\.(.+)/
          domain = $1;
          log = "#{LOG_DIR}/#{domain}-access_log"
          tmplog = "#{TMP_DIR}/#{domain}-log.utf8"
          system("#{UTF8_DECODE} < #{log} > #{tmplog}")
          begin
            File.truncate(log, 0)
            system("#{AWSTATS} -config=#{domain} -update")
          ensure
            File.unlink(tmplog)
          end
        end
      end
    ensure
      Dir.rmdir(TMP_DIR)
    end

    作成したスクリプトに実行権限を与えます。


    # chmod +x /usr/local/bin/awstats-update

    cron で自動的に実行されるように crontab を設定します。


    # crontab -e

    以下を追加。


    00 * * * * /usr/local/bin/awstats-update > /dev/null

    これで設定は完了です。ログは1時間ごとに集計されて http://xxx.xxx.xxx/awstats/awstats.pl で参照することができます。複数のホストについて設定した場合は、ホスト名を変更してアクセスするだけで自動的に AWStats が適切な設定ファイルを読み込んで動いてくれます。





アクセス解析「AWStats日本語版」のインストール方法メモ その1

Posted by admin | Perl, アクセス解析 | 月曜日 21 4月 2008 4:23 PM

アクセス解析ツール「AWStats」のインストールメモ。

参考URL:
http://www.bflets.dyndns.org/Tools/AWStatsJpn.html
AWStats 完全日本語版の導入

  1. Jcode.pm のインストール
  2. まず、日本語版で必要とされる perl のライブラリ Jcode.pm を インストールします(インストール方法は「Jcode.pm のインストール方法メモ」参照)

  3. AWStats 日本語版の取得とセットアップ
  4. AWStats 日本語版のアーカイブファイルを取得します。2008年4月21日現在、最新バージョンは 6.6 です。最新バージョンは公式ページでチェックしてください。ダウンロードが終わったら解凍します。


    # wget http://www.bflets.dyndns.org/AWStats66_Jpn.tar.gz
    # tar -zxvf AWStats66_Jpn.tar.gz


    解凍したディレクトリは名前を変えて /usr/local 下に置きます。ここ以外に置くと AWStats が警告を発する場合があります。


    # mv AWStats66_Jpn /usr/local/awstats


    次に AWStats の集計データを入れるディレクトリを作成します。


    # mkdir /var/lib/awstats


    AWStats の CGI ディレクトリに移動します。


    # cd /usr/local/awstats/wwwroot/cgi-bin


    デフォルト設定ファイル awstats.model.conf を作ります。すでに日本語のデフォルト設定ファイルが別名で存在しますのでコピーして使用します。


    # cp awstats.model_jp.conf awstats.model.conf


    ツールディレクトリに移動し、設定スクリプトを実行します。


    # cd /usr/local/awstats/tools
    # ./awstats_configure.pl


    すると Apache の設定ファイルのありかを聞かれます。ここで Apache の設定ファイルを答えると設定ファイルが書き換えられてしまうので「none」を入力してスキップします(Apache の設定ファイルは後ほど手動で編集します)。


    -----> Check for web server install

    Enter full config file path of your Web server.
    Example: /etc/httpd/httpd.conf
    Example: /usr/local/apache2/conf/httpd.conf
    Example: c:\Program files\apache group\apache\conf\httpd.conf
    Config file path ('none' to skip web server setup):
    > none


    次に設定ファイルを作るかと聞かれます。もちろん Yes です。


    -----> Need to create a new config file ?
    Do you want me to build a new AWStats config/profile
    file (required if first install) [y/N] ? y


    設定対象のホスト名を聞かれますので入力します。


    -----> Define config file name to create
    What is the name of your web site or profile analysis ?
    Example: www.mysite.com
    Example: demo
    Your web site, virtual server or profile name:
    > blog.96q.org ←ご自分が管理しているホスト名


    設定ファイルのありかを聞かれます。デフォルトの /etc/awstats で良いのでそのまま Enter キーを押します。


    -----> Define config file path
    In which directory do you plan to store your config file(s) ?
    Default: /etc/awstats
    Directory path to store config file(s) (Enter for default):
    > ←何も入力せずに Enter


    その後確認の意味を込めて Enter の入力を求められますので、適宜 Enter キーを押してください。


    -----> Add update process inside a scheduler
    Sorry, configure.pl does not support automatic add to cron yet.
    You can do it manually by adding the following command to your cron:
    /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=centos.oss.sc
    Or if you have several config files and prefer having only one command:
    /usr/local/awstats/tools/awstats_updateall.pl now
    Press ENTER to continue... ←何も入力せずに Enter


    A SIMPLE config file has been created: /etc/awstats/awstats.centos.oss.sc.conf
    You should have a look inside to check and change manually main parameters.
    You can then manually update your statistics for 'centos.oss.sc' with command:
    > perl awstats.pl -update -config=centos.oss.sc
    You can also build static report pages for 'centos.oss.sc' with command:
    > perl awstats.pl -output=pagetype -config=centos.oss.sc

    Press ENTER to finish... ←何も入力せずに Enter


    もし、バーチャルホストとして他にも Web サイトを運営している場合は、この設定スクリプトをそのバーチャルホストぶん実行してください。

     この設定スクリプトで生成した設定ファイルはそのままでは使えませんので修正します。なお、blog.96q.org という部分はご自分が管理しているホスト名に読み替えてください。


    # vi /etc/awstats/awstats.blog.96q.org.conf


    LogFile="/var/log/httpd/mylog.log"

    LogFile="/tmp/hl/blog.96q.org-log.utf8"


    最後に後始末をします。


    # cd
    # rm -rf AWStats66_Jpn.tar.gz


    以上で AWStats のセットアップは終了です。


その2へ続きます