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

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

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

という事で、約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

アクセス解析「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}&quot;)
          begin
            File.truncate(log, 0)
            system("#{AWSTATS} -config=#{domain} -update&quot;)
          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 が適切な設定ファイルを読み込んで動いてくれます。