指定した日に更新されたファイルを探す

いつもの通り、OSはSolaris 9 です。
Linuxではlsコマンドに「--full-time」というオプションがあるが、Solaris標準のlsにはない。また、findの「-mtime」オプションで探そうにも、2008年1月1日が何日前なのか知らないと使えない。そして、Solarisにはstatコマンドが無い。なので、perlスクリプトを書いて見ました。

<stat.pl>

#!/usr/bin/perl
$date = "$ARGV[0]";
$file = "$ARGV[1]";
@stat = stat $file;
($sec,$min,$hour,$mday,$mon,$year) = localtime($stat[9]);
$mon++;
$year+=1900;
if($date == sprintf("%4d%02d%02d"), $year, $mon, $mday)){
    printf("%s\n", $file);
}

見苦しいところはご愛嬌。これを使うには、こんな感じかな。

$ find /tmp -type f -exec stat.pl 20080101 {} \;

こうすると、2008年1月1日に更新されたファイルの一覧が出せる。

Solarisで1970年1月1日からの日数を表示するコマンド

GNU版のdateとかだと、+%sで1970年1月1日0時0分0秒からの秒数(エポック)を表示できるが、Solarisの純粋な環境だとこれが出来ない。パスワードの有効期限があと何日かを知りたいときにはちょっと不便。そこで、無理やりこんな1行コマンドを作ってみました。

# echo $((`truss date 2>&1 | grep time | cut -d" " -f2`/60/60/24))
  • trussってのは、Linuxでいうところのstraceと同じで引数に与えられたプログラムが内部で実行するシステムコールをトレースしてくれるコマンド。
  • dateコマンドの中で発行しているtimeシステムコールの戻り値を秒から日数に変換。

そんな感じで完成です。

メモリ不足の指針

OSのメモリが足りるかどうか判断するのに、空きメモリ(freemem)を確認するのは非常に有効な手段だ。しかし、他にも「OSがメモリを探している」動作を確認するすべはある。それがpgscanを確認する方法だ。pgscanとはOSが空きメモリを探している(走査している)回数を示す値だ。

# sar -g
SunOS venus 5.8 Generic sun4u 09/07/99

00:00:00 pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
01:00:00 0.00 0.00 0.00 0.00 0.00
02:00:02 0.00 0.00 0.00 0.00 0.00
03:00:00 0.00 0.01 0.01 0.00 0.00
04:00:00 0.00 0.00 0.00 0.00 0.00
05:00:01 0.00 0.00 0.00 0.00 0.00
06:00:00 0.00 0.00 0.00 0.00 0.00

Average 0.01 0.12 0.21 0.66 0.00

1秒間に何回の走査をしたか、という値だ。およそ、秒間5回以上行っているようであれば不足していると判断して問題ない。freememが無いけれど、pgscanも発生していなければ、メモリはちょうど足りているとも考えられる。

シェルスクリプトで標準入力を一文字ずつ読み込む方法

シェルスクリプトで対話式のツールを作っていると、標準入力を一文字ずつ処理したくなることってありますよね。そんなときはこれを使えばOK!
注意すべきことは、bashの組込コマンドとしてのread特有のオプションだということ。

# read -s -n 1 CHAR

これを使ってスクリプトを書くときはwhileとかでまわしちゃって!!

ターミナルの任意の位置に移動する

シェルスクリプトを書いていると、「毎回20行目にフッタを表示させたい」なんてことがたまにあります。そんなときは、echo制御の出番です。

# echo -n "^[[20;1H"

これで20行目の1文字目に移動します。ちなみに"^["はエスケープで、「Ctrl + v → Esc」の順に押すと入力できます。
参考URL:http://codezine.jp/article/detail/67?p=1

lessで日本語を表示すると文字化けする

Solaris 9 環境でLANG=ja_JP.PCKにして使用しています。テキストファイルをviなどで編集(作成)すると、SJISで保存されます。lessで表示すると文字化けしてしまう、という問題です。
これは以下の環境変数で回避することが出来ます。

LESSCHARSET=dos

また、これで回避できない場合は、バイナリを素通しするオプション

-r

さらに、

may be a binary file. See it anyway?

と表示されるのを防ぐ為に、強制表示オプション

-f

を指定すれば、ターミナルの文字コード設定で表示できます。
ただし、エスケープシーケンスがあると、崩れるという情報もあります。

logadm.confのデフォルトコンディション

/etc/logadm.conf にて、ログの切替定義ができるが、デフォルトでは以下のような設定がされている。

パラメータ 意味
-s 1b ゼロバイト以外なら切替の対象とする
-p 1w 前回の切替より一週間以上経過していれば切替の対象とする

また、logadm.confでは-Sや-Pというパラメータが用意されている。すべてに対して当てはまるわけではないが、小文字のパラメータは切替前のログに対する条件の設定、大文字のパラメータは切替後のログに対する条件の設定といったルールがあるようだ。