Skip to content

logrotateでcopytruncateしてもサイズが大きいまま

logrotateでcopytruncateしてもサイズが大きいまま published on logrotateでcopytruncateしてもサイズが大きいまま へのコメントはまだありません

logrotateには色んなオプションがある。(logrotateが何をするツールかはググって下さい)。そのうちの1つに copytruncate というものがある。動作としては以下の通り。

  • 対象ログがa.logだとすると、それを a.log.0 あるいは a.log-yyyymmddにコピー
  • a.logをtruncate (内部的には cp /dev/null /path/to/a.log みたいな処理)

ログ・ファイルのサイズが大きいままになる問題

ログファイル名は a.log とする。logrotate の設定で copytruncate になっているとすると、ローテートの際に、前述の通り a.log が a.log.0 にコピーされる。a.log が 100KBだとすると、a.log.0 は100KBで、その後 a.log は truncate されて 0バイトになるはず。

だが、以下の様な現象が起こる場合がある。

  • a.log が a.log-0 にコピーされる (a.log-0 のサイズは100KB)。
  • a.log が truncate される。
  • a.log のサイズが 100KBに戻る。

a.log の最初の100KBはNULL byte(\0)で埋められ、その後からログが書き込まれる。

想像がつくと思うけど、ログファイルに書き込むプロセスが保持しているファイルポインターが100KBの位置のままの場合、a.log が truncate されてサイズが0になっても、その後のログ書き込みで100KBの位置に書き込まれ、結果として最初の100KBがNULLで埋められる。

原因、解決方法

ログファイルを開く際に O_APPEND オプションが付いていない場合にこうした現象が起こる。シェル(sh や bash)の場合、

$ command > a.log

の場合、O_APPEND 無しでファイルが開かれるので、上のような現象が発生する。それに対して、以下の場合には問題が発生しない。

$ command >> a.log

ということで、シェルスクリプトからログファイルにログを書き込む際に > でリダイレクトをしている場合、logrotate の copytruncate で上のような問題が発生するので、 >> を使うようにすると良い。

なんで > と >> で挙動が違うかは、歴史的背景らしい。

参考

ググって見つけたこのページこのページが参考になった。

bashのドル記号の用法をいくつか

bashのドル記号の用法をいくつか published on bashのドル記号の用法をいくつか へのコメントはまだありません

bashではドル記号($)で色々な場面で使う(Bourne shellでも使うけど)。自分が知ってる範囲でまとめてみた。

変数の参照

基本中の基本なんで敢えて書く必要はないかも。

foo=1234       # 変数の定義
echo $foo      # 変数の参照
ary=(1 2 3)    # 配列の定義
echo ${ary[1]} # 配列の要素の参照
for e in ${ary[@]} .... # 配列全体の参照

Continue reading bashのドル記号の用法をいくつか

Mac OS X LionでLC_CTYPE: cannot change locale (UTF-8)とか言われる

Mac OS X LionでLC_CTYPE: cannot change locale (UTF-8)とか言われる published on Mac OS X LionでLC_CTYPE: cannot change locale (UTF-8)とか言われる へのコメントはまだありません

今更ながらMac OS X Lionにアップグレードした。

いつも通り仕事用のサーバーにログインしたら以下のようなエラーメッセージが出た。

bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8)

LC_TYPEがおかしいらしいので、 一度ログアウトしてMac側のターミナルで以下の通り確認すると、UTF-8という謎の値に設定されている・・・

$ env | grep LC_TYPE
LC_TYPE=UTF-8

とりあえずこれを解除すればいいんだけど、どこでやるのが一番いいかなぁと思ってちょっと調べた所こちらのページが見付かった。

Terminal > Preferences > Settings > [profile] > Advanced > Set locale environment variables on startupのチェックを外したらOKだった。

Linuxerの為のFreeBSD入門(2)

Linuxerの為のFreeBSD入門(2) published on Linuxerの為のFreeBSD入門(2) へのコメントはまだありません

前回、基本的な設定とかを行ったので、今回は必要なパッケージを入れていく。

ちなみに環境はFreeBSD 8.1

・emacs

/usr/ports/editors/emacs がそれ。ちなみにバージョンは23系。/usr/ports/editorsの下にはemacs22とemacs21というのもあり、古いバージョンを使いたい場合はそちらを使用すると良さそう。

sudo make installをすると、色々なオプションが選択できるけど、画像表示やらフォントがとかのオプションが多い。SSH経由でしか使わない人は、X関連はオフにしたい。その場合、/etc/make.confに以下の行を追加すればよい。

WITHOUT_X11=yes

Continue reading Linuxerの為のFreeBSD入門(2)

Linuxerの為のFreeBSD入門(1)

Linuxerの為のFreeBSD入門(1) published on Linuxerの為のFreeBSD入門(1) へのコメントはまだありません

訳あって、生まれて初めてFreeBSDをちょっと触ってる。

UNIX系OSはLinux、Solarisあたりはまぁまぁ分かるしそれ以外にもちょこちょこ触ったことはあるけど、一番経験が多いのはLinux(特にRedHat系)なので、他のOSに移ると戸惑うことが多い。

と言うことで、自分のようなLinuxユーザー向けにFreeBSDの基礎的なことを書く。というか単なるメモ書き。

■環境

  • さくらのVPS 512
  • FreeBSD 8.1

Continue reading Linuxerの為のFreeBSD入門(1)

UbuntuにJava入れた

UbuntuにJava入れた published on UbuntuにJava入れた へのコメントはまだありません

■背景

Scalaを触り始めて1ヶ月位経つが、殆ど勉強が進んでいない。言い訳をすると、開発環境が整わないと勉強のスピードが上がらないタイプ。

sbtの使い方は少し分かってきたので、あとはコードを書く環境を整える必要がある。Eclipse + Scala pluginに挫折したのでEmacsのプラグインであるensimeなるものを試してみることにした。

Windowsでやってもいいけど、Emacs使いの大半はUNIX系で使ってるだろうから、Windows固有の問題とかがありそうなのでパス。じゃLinuxでと思ったが、ensimeの前提としてemacs 22か23が必要。CentOSに入っているemacsは21で、バージョンアップも面倒そうなのでUbuntuが入っているVPSを使う事にした。

で、そもそもScalaを動かすにはJavaが必要なので、UbuntuにJavaを入れる必要がある。

とまぁかなり長い前振り。

■やること

たった1行だけ…

apt-get install sun-java6-jdk

ちなみに、Javaはsun-java6-jdkと、オープンソースライセンスのopenjdk-6-jdkの2種類がある。

 環境:Ubuntu 9.0.4

Continue reading UbuntuにJava入れた

Ubuntu初心者のメモ

Ubuntu初心者のメモ published on Ubuntu初心者のメモ へのコメントはまだありません

最近ちょっとIPv6の実験とかを色々してて、IPv6が使えるVPSを探していた時に、ARP Networksという会社のVPSを薦められた。

大手ではないものの結構しっかりしているらしく、結構売り切れちゃうことが多い模様。自分が契約をしようと思った8/11には売り切れていて、8/25まで待たなければいけなかった。

さて、そこのVPSはメインストリームに媚びないというか何というか、CentOSが選べないので、Ubuntuにしてみた。今までUbuntuを使ったことがないので結構色々な違いがあるんだなぁと日々実感。

以下、RedHat系ユーザーが初めてUbuntuを使った際に気づいた点をメモ書き。

  • useraddはデフォルトだとホームディレクトリを作成しない
  • 同じくuseraddで、デフォルトシェルが/bin/sh
  • デフォルトだとEDITOR=nano。ま、gentooで慣れてるからいいけど。
  • sudo apt-get update , sudo apt-get upgrade

随時追記。

UNIX系システムのパフォーマンス調査

UNIX系システムのパフォーマンス調査 published on UNIX系システムのパフォーマンス調査 へのコメントはまだありません

自分用メモ

UNIX系OSでパフォーマンスに問題を抱えているシステムの調査の仕方が書いてあるWebページ(英文)。まぁ大体知っている内容だけど、人に何か聞かれたときに勧めても良いページかな、と。

LinuxとかSolarisとかの特定のOSに特化した内容ではなく割と汎用的な記事。

M-x grep

M-x grep published on M-x grep へのコメントはまだありません

絶対存在するとは思ってたけど今まで使ってなかった機能。Emacsからのgrep呼び出し。

単にM-x grepと実行するだけ。実行するとミニバッファに以下のようなのが現れるので、後は通常のgrepコマンドと同様に入力するだけ。

Run grep (like this): grep -n -e

ちなみに自分は今まで-nとか-eなんて使った事無かった。

  • -n : 行番号表示
  • -e : 正規表現を使用

ちなみに-eの直後に検索パターンが来なきゃいけないから、-Rを使うときは-eの前に書かないとダメだね。以下のようなエラーになる。(30秒くらいハマった。)

cd /var/www/html/
grep -n -e -R mojiretsu * /dev/null
grep: mojiretsu: そのようなファイルやディレクトリはありません

MySQL 5.1 on Cent OS 5.3

MySQL 5.1 on Cent OS 5.3 published on MySQL 5.1 on Cent OS 5.3 への2件のコメント

MySQL 5.1がGAになってからしばらく経ったのに使った事無かったので、今やっている実験プロジェクトで採用してみた。

CentOSの標準パッケージだとmysqlのバージョンは5.0。mysql関連パッケージもmysql-5.0に依存しているので、その辺をクリアする必要がある。

とりあえず手順やエラーメッセージのみを簡潔に説明。

1. 既存のMySQLパッケージを(インストールされていれば)アンインストール

2. MySQL公式サイトからのRPMパッケージをインストール
この辺りからパッケージをダウンロード。使用したのは以下のもの。

  • MySQL-client-community-5.1.34-0.rhel5.i386.rpm
  • MySQL-server-community-5.1.34-0.rhel5.i386.rpm
  • MySQL-shared-community-5.1.34-0.rhel5.i386.rpm

rpm -ivhで普通にインストールすればOK。

ここまでは特に問題ないと思うんだけど、php-mysqlをインストールしようとして問題発生。

Continue reading MySQL 5.1 on Cent OS 5.3