2006-06-15 (Thu)

* cygrunsrv が CPU を消費して Windows Update できない件の対処

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Windows] [unix]

Windows Update 中に cygrunsrv が CPU を消費して Windows Update が進まなくなった。cron サービスを一時的に停止して対処。

- Windows Update が途中で止まる

一台の Windows2000 SP4 マシンで Windows Update (正確には Microsoft Update かな?) に失敗しているという現象があった。更新のダウンロードは問題なく完了しているのだが、その後のインストール中に先に進まなくなってしまう。

「更新をインストールしています」という画面でその現象が出る。「Outlook Express 6 Service Pack 1 の累積的な修正プログラム (KB911567) をインストール中 (更新 12 個中 2 個)...」のインストール中に何かが進行を妨げているようだ。

- cygrunsrv の CPU 使用率が異常に高い

何か暴走しているプロセスがあるのではないかと考えてタスクマネージャを見ると、cygwin のデーモンを司るプロセスである cygrunsrv の CPU 使用率が跳ね上がっている。私の環境では cygwin で cron を使っているので cygrunsrv が起動しているのだが、これが原因なのだろうか?

- cygrunsrv を止める

タスクマネージャで cygrunsrv を kill 仕様としたが、操作を拒否された。仕方がないので OS を再起動。「コントロールパネル」の「管理ツール」の「サービス」で、cron サービスを止めたところ、cygrunsrv のプロセスがタスクマネージャから消えた。

- Windows Update 成功

cgyrunsrv を止めた状態で Windows Update したところ、正常にアップデートできた。

2005-12-07 (Wed)

* gzip/bzip2 は環境変数 GZIP/BZIP2 で圧縮レベルのデフォルト値を指定できる

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix] [Apache] [シェルスクリプト]

2005-12-04 に書いた「gzip 圧縮されたファイルを最強の圧縮レベルで再圧縮」について、いくつか指摘を頂いた。ありがとうございます。本当に、当サイトにも早くコメント欄を付けるべきだなあ・・・。

まずは掲示板 (wiki でしたっけ?) の「イナモデ」に書かれていた指摘。
http://inamode6.tokuhirom.dnsalias.org/show/1827
わざわざ再圧縮するんであればbzip2使えばgzip -9より圧縮できるだろう。

今回の圧縮対象はテキストのログなので、確かに bzip2 の方が圧縮率は高くなるでしょうね。でも、以下の2つの理由で bzip2 は使いませんでした。

1. さくらインターネットが採用しているログ圧縮やローテーションの仕組みがわからないので、その仕組みによっては bzip2 で圧縮したファイルをさらに gzip 圧縮するとういう動きをするかもしれなかった。gzip や bzip2 コマンドならば、圧縮済みファイルだったら何もしないという動きをすると思いますが、さくらインターネットが採用している仕組みがわからなかったので現状維持で gzip としました。

2. さくらインターネットでは webalizer でアクセスログからレポートを生成しているが、webalizer が bzip2 で圧縮されたログを読めるかどうかわからないので不安だった。たぶん大丈夫なんでしょうけど、そこまで冒険することもないかなあと。

> ところで、この圧縮率の差が生まれる原因って、logrotate か rotatelogs あたりのオプションにあるのかな? それとも独自のシェルスクリプトか何かのオプションが原因なのかな。

man 1 gzipに「The default compression level is -6 (that is, biased towards high compression at expense of speed). 」と書いてあるって。

あ、疑問の趣旨は、logrotate や rotatelogs を使ってるとして、そこから呼びだされている gzip や zlib の圧縮レベルを指定してるのはどこなのかな、というものです。それで、logrotate や rotatelogs は圧縮レベルを指定できるオプションを持ってるのかな、というのが元の文の意味です。わかりにくかったですね。

gzip コマンド自体が圧縮レベルを指定できるオプションを持ってるのは知ってたので、とりあえずレベル最強で圧縮し直すという単純な解決法をとったわけですしね。

そういえば、その昔に linux の logrotate を使ってた頃は、何もしなくても gzip -9 と同等の圧縮レベルが指定されてたような気がします。気のせいかもしれないけど・・・。

- gzip/bzip2 コマンドは環境変数 GZIP/BZIP2 でオプションのデフォルト値を指定できる

freebsdグループ - TransFreeBSDの日記 - gzipの圧縮レベルを変えるには
http://freebsd.g.hatena.ne.jp/TransFreeBSD/20051205/p2
私も、newsyslogとかにオプションとかあるかもと思って、ちょっと探したけどなかった。で、gzipは環境変数「GZIP」にオプションを設定できるらしい。

On-line Manual of ”gzip”

というわけで、newsyslogとかlogrotateとかがこの環境変数を消していなければ、crontabに設定すればわたるはず。

あと、さくらインターネットの専用サーバはFreeBSDが選べますが、レンタルサーバのOSは何だろう。FreeBSDならbzip2の方がお得だと思います。

これは知りませんでした。確かに man ページに書いてありました。「よく使ってるコマンドでも man を読むと発見がある」という好例ですね。勉強になりました。

Manpage of GZIP
http://www.linux.or.jp/JM/html/GNU_gzip/man1/gzip.1.html
環境変数
環境変数 GZIP に gzip のデフォルトのオプションセットを入れることができる。これらのオプションは最初に解釈されるので、明示的なコマンドラインパラメータで上書きすることができる。例を示す。
      sh の場合:    GZIP="-8v --name"; export GZIP
      csh の場合:  setenv GZIP "-8v --name"
      MSDOS の場合: set GZIP=-8v --name

bzip2 コマンドも同じように環境変数 BZIP2 と BZIP でオプションのデフォルト値を指定できるようですね。

Manpage of bzip2
http://www.linux.or.jp/JM/html/bzip2/man1/bzip2.1.html
bzip2 は環境変数 BZIP2, BZIP からこの順番で引き数を読み込み、コマンドラインから読み込まれた引き数よりも先に処理する。これはデフォルトの引き数を与える便利な方法である。

ただ、やっぱりさくらインターネットのログ切り出しと圧縮の仕組みがわからないので、2005-12-04 の再圧縮スクリプトを cron で実行という方法を取ろうと思います。運営側で圧縮レベルを上げるという対処をしてくれるかどうかもわからないですしね。とりあえず後でサポートに要望を出しておこうとは思ってます。

そうそう、さくらインターネットのレンタルサーバは FreeBSD でした。uname -a したら以下のように出力されました。

$ uname -a
FreeBSD www****.sakura.ne.jp 4.10-RELEASE-p16 FreeBSD 4.10-RELEASE-p16 #0: Thu Aug  4 11:51:09 JST 2005    root@******.sakura.ne.jp:/usr/src/sys/compile/SAKURA8S  i386


2005-12-04 (Sun)

* gzip 圧縮されたファイルを最強の圧縮レベルで再圧縮

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix] [Apache] [シェルスクリプト]

当サイト http://sonic64.com/ は、さくらインターネットのレンタルサーバーサービスを利用している。レンタルなので、ディスク容量が足りなくなっても自宅のクライアント PC と違って簡単に増設することはできない。ディスク容量は貴重だ。ディスクの1バイトは血の一滴。

で、さくらインターネットでディスクの無駄遣いを見つけた。さくらインターネットでは各ユーザーに apache のアクセスログが提供されていて、最新のログ以外は gzip で自動的に圧縮される。そのときの gzip のレベルが -9 になっていないので、ディスクスペースが無駄になっている。

非常に細かいんだけど、gzip の圧縮レベルがデフォルトの -6 と -9 では、圧縮後のファイルサイズで一日あたり100KB くらいの違いが出てくる。ログは1年分保存されるので、100KB * 365 = 36.5MB の差がある。これはちょっと無視できない。

というわけで、gzip 圧縮されたファイルを最強の圧縮レベルで再圧縮するスクリプトを書いた。

#!/bin/sh

find $HOME/log -type f -maxdepth 1 -mtime +1 -mtime -2 -regex .*.gz |xargs gunzip
find $HOME/log -type f -maxdepth 1 -mtime +1 -mtime -2 ! -regex .*.gz |xargs gzip -9

やってることはものすごく単純。単に2日前の圧縮ファイルを find で探し出して展開、その後最高の圧縮レベルを指定した gzip で再圧縮してるだけ。直近1日以内のファイルはまだ gzip されてないので除外。2日以上前のファイルは、このコマンドで処理済みなので除外。

これを cron で一日一回実行するために crontab に仕込んでおく。一応 nice コマンドでプロセスの優先度を最低にしておく。

# recompress with max compression level
5 6 * * * nice -19 $HOME/script/recompress_log.sh

ここまでやって思ったんだけど、これってさくらインターネットのサポートに要望として出した方がいいかな。そうすれば全ユーザーが幸せになれるな。よし、あとでサポートにメールしておこう。

ところで、この圧縮率の差が生まれる原因って、logrotate か rotatelogs あたりのオプションにあるのかな? それとも独自のシェルスクリプトか何かのオプションが原因なのかな。

追記。
2005-12-07 に『「gzip 圧縮されたファイルを最強の圧縮レベルで再圧縮」への指摘とその反応』を書いた。

2005-10-18 (Tue)

* シェルのプロンプトに時刻を表示する

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix] [Linux] [bash]

.bash_profile の記述を変更して以下のようにし、プロンプトに時刻が表示されるようにした。プロンプトに時刻が入っていると、コマンドの実行を開始したおおよその時間がわかるので便利。

export PS1="\[\033[1;32m\][\t][\u@\h \w]$\[\033[0m\] "

時刻を表示してくれているのは [\t] の部分。\u はユーザ名、\h はホスト名。ちなみに先頭の \[\033[1;32m\] と 末尾の [\033[0m\] は、プロンプトを緑色にするための設定。私は端末の背景色を黒にしているので、緑色が映える。それに、プロンプトの色を地の文の色と変えておくと、長い出力があった後にスクロールバーを操作してプロンプトを探そうとしたときに見つけやすい。

実際のプロンプトは以下のように表示される。
[23:06:33][hiroaki@sonic64 ~]$

2005-10-16 (Sun)

* quota コマンドと容量情報の更新タイミング

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

1GB の quota (容量制限) がある unix サーバを使っている。そろそろ制限に引っかかりそうだったので、大きなファイルを削除して quota コマンドで使用容量を確認したが、使用中の容量が減っていない。空き容量200MB の状態で450MB くらいのファイルを削除したのに、空き容量は200MBくらいから変わっていない。

[00:33:15][hiroaki@sonic64 ~]$ quota
Disk quotas for user hiroaki (uid 1024):
    Filesystem  usage  quota  limit  grace  files  quota  limit  grace
          /home  823754 1048576 1048576            9135 1000000 1000000
          /var    330  204800  204800            142    1000    1000

もしかして、quota コマンドで表示される情報って、リアルタイムじゃないのかな? Google で quota 更新 を検索するとヒット。

種々の quota コマンド
http://www.linux.or.jp/JF/JFdocs/Quota/commands.html
quotacheck は、あるファイルシステムのディスク利用状況をスキャンし、quota 記録ファイルである quota.user を最新の状態に更新する際に使用します。システム起動時に quotacheck を走らせるか、cron ジョブとして定期的に実行する (例えば、毎週とか) ことをおすすめします。

やっぱり。そりゃそうか。リアルタイムで全ファイルをスキャンして、ディスク使用量を毎回集計してたんでは遅いもんね。

5分ほど経ってからもう一度 quota したら反映された。

[00:38:52][hiroaki@sonic64 ~]$ quota
Disk quotas for user hiroaki (uid 1024):
    Filesystem  usage  quota  limit  grace  files  quota  limit  grace
          /home  353454 1048576 1048576            9136 1000000 1000000
          /var    330  204800  204800            141    1000    1000

2005-08-25 (Thu)

* man ページの文法と書式の読み方

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

「man ページのセクション番号の意味」は 2005-08-09 に要点を書いた。しかし、コマンドやオプションの文法についてはなんとなくわかったつもりになってたのでメモ。これらは書式 (SYNOPSIS) と呼ぶ。

Software Design 2005年9月号63ページ
[] は、省略可能なオプション (とその引数)
{} は省略不可能なオプションで、中に選択肢 (次行) が示される
| は選択肢で、列挙されたいずれかを排他的に選択する
... は繰り返し

上記がわかれば、以下のような書式の意味もわかる。

passwd [-f|-s] [name]
-f か -s を指定できる。name 指定できる。オプションはすべて省略可能なので、passwd だけでも OK。この場合は自分自身のパスワードを変更するモードだね。

passwd [-g] [-r|-R] group
-g を指定できる。-r か -R を指定できる。 group は 必須。

passwd [-x max] [-n min] [-w warn] [-i inact] login
-x とその引数を指定できる。 -n とその引数を指定できる。-w とその引数を指定できる。-i とその引数を指定できる。login は必須。

passwd {-l|-u|-d|-S|-e} login
-l -u -d -S -e のいずれかが必須。login は必須。

2005-08-09 (Tue)

* man ページのセクション番号の意味

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

Unix 関連の文書を読んでいると、コマンドなどの後ろに数字が書かれているものを目にすることがある。たとえば、mail(1) など。この (1) はセクション番号を表している。ここまでは覚えてるんだけど、「どの番号がどのセクションを表しているのか」はなぜかどうしても覚えられないのでメモ。

THE LINUX MAN-PAGE-HOWTO : man page はいかにしてアクセスされるか?
http://www.linux.or.jp/JF/JFdocs/Man-Page-2.html
man page はすべて、特定のセクションに所属しており、このセクションは1文字で表されている。Linux での標準のセクションとその意味は次の通り。


セクション  名前

    1      だれもが実行できるユーザコマンド
    2      システムコール、つまり、カーネルが提供する関数
    3      サブルーチン、つまり、ライブラリ関数
    4      デバイス、つまり、/dev ディレクトリのスペシャルファイル
    5      ファイルフォーマットの説明、例 /etc/passwd
    6      ゲーム(説明不要だろうネ)
    7      その他  例: マクロパッケージや取り決め的な文書
    8      システム管理者だけが実行できるシステム管理用のツール
    9      Linux 独自のカーネルルーチン用のドキュメンテーション
    n      新しいドキュメンテーション:よりふさわしい場所に移動されるだろう
    o      古いドキュメンテーション 猶予期間として保存されているもの
    l      独自のシステムについてのローカルなドキュメンテーション

私はこのセクション番号を併記することはほとんどない。だから覚えられないんだろうけど。セクション番号を使うとすれば、コマンド名とライブラリの関数名が同じもので、それを明示的に区別したいときくらいかなあ。以下の mount のようなパターン。

セクションとは? (Japanese)
http://www.linux.or.jp/JM/section.html
マニュアルのファイル名は通常 foo.1 のように表記され、 最後の .1 にあたる部分がセクションを表します。 例えば mount.2 は mount システムコールの説明ですし、 mount.8 はディスクマウントを行うシステムコマンドの説明になるわけです。

2005-07-06 (Wed)

* find コマンドの -mtime は +1 でも2日前のファイルが対象

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix] [シェルスクリプト]

find コマンドの -mtime は +1 でも2日前のファイルが対象となる。つまり、(n + 1) 日前のファイルが対象。n は +0 を指定しても、一日以上前のファイルが対象になる。

- find が古いファイルを検索してくれない

とあるテスト用 DB があり、定期的にバックアップを取っている。バックアップ先はディスク容量に余裕がないので、以下のような古くなったバックアップファイルを消す cron を設定しておいたのだが、どうもうまく動いていない模様。今日は7月6日なのに、7月4日のファイルがまだ残っているのだ。

6 0 * * * /usr/bin/find /cygdrive/c/DB_BACKUP -maxdepth 1 -type f -mtime +1 |/usr/bin/xargs /bin/rm -f

毎日午前0時6分に起動。一日以上経過したバックアップファイルを find で探しだし、xargs から起動する rm に渡して削除するというシンプルなコマンド。2003-04-16 の「n 日以前のタイムスタンプを持つファイルを消す」にも書いた。cron と find があるマシンでは重宝している。なんで今になってうまく動かないことが発覚したんだろう? 実行環境が Windows2000 + cygwin だから? まさか。

まずは原因を切り分けよう。xargs に渡す前の find だけを実行してみると、古くなったバックアップファイルが find の対象になっていない。なんでだろう? mtime の指定が間違っているのだろうか? find の man を見てみる。

Manpage of FIND
http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.htm ...
-mtime n
ファイルのデータが最後に修正されたのが n*24 時間前なら真。

うーん、間違ってないよね。試しに -mtime +1 を -mtime 1 にしたところ、古いバックアップファイルが find の検索対象となった。ここが間違ってるのかな?

判別式

数値の引き数を

+n
と表わすと n より大きいことを示し、

-n
と表わすと n より小さいことを示す。

n
はちょうど n と等しいことを示す。

別におかしくないよなあ。-mtime +1 なら、24時間以上前なら真ってことでしょ? それとも何か勘違いしてる? ちょっとテストしてみるか。

- テスト

find の削除対象にならないタイムスタンプを持つファイルを作成してみる。

その前に、該当マシンのマシンデイトの確認。
$ date
Wed Jul  6 10:25:14    2005
よし、合ってるね。NTP で合わせてるんだから当たり前だけど。

Windows エクスプローラで確認すると、該当のファイルのタイムスタンプ情報は以下の通り。
作成日時: 2005年7月4日、14:00:16
更新日時: 2005年7月4日、14:00:16
アクセス日時: 2005年7月6日、10:06:52

-mtime は更新日時のことなので、-mtime +1 の「一日以上前のファイル」という 条件には合致するはずだ。

まず touch で当該タイムスタンプを持ったファイルを生成し、ls -l でタイムスタンプを確認。

$ touch -m -t 200507041400.16 200507041400.16

$ ls -l
-rw-r--r--    1 Administ なし            0 Jul  4 14:00 200507041400.16

問題なく生成された。ファイル名も 200507041400.16 にした。

では find 実行。

$ find -mtime 1
./200507041400.16

$ find -mtime +1

あれ? なんで? 明らかに一日以上経過しているファイルなのに、+1 だと find の対象にならず、1 だと find の対象になる。この Windows2000 + cygwin 環境の find がおかしいのか? 念のため TurboLinux Server 6.5 でも同じことをやってみる。

[hiroaki@pro ~/test/find_test]$ find -mtime 1
./200507041400.16

[hiroaki@pro ~/test/find_test]$ find -mtime +1

同じだ・・・。なんでだろう?
+1 の条件を変えて +0 でやってみると検索対象になった。そういうことか。つまり、+0 を指定したら、0 * 24 = 0 なので、全てのファイルが対象になると思うところだが、そうはならないんだろう。

試してみる。touch now で現在時刻の mtime を持つファイルを作成し、mtime +0 で find の検索対象になるか試す。

$ touch now

$ find -mtime +0
./200507041400.16

find の検索対象にならない。そういうことか。

- find の -mtime +n のまとめ

find の -mtime +n の検索対象となるファイルは以下の通り。

mtime +0 今から24時間以上前のファイル
mtime +1 今から48時間以上前のファイル
mtime +2 今から72時間以上前のファイル

(n + 1) * 24 ってことだね。man にそう書いてあれば良かったのに。あとでスクリプトを書いて試してみよう。

- 一時間ずつずらしたタイムスタンプを持つファイル群を生成する Perl One Liner を使ってテスト

以下を実行すると、200個のファイルが生成される。ファイルのタイムスタンプはそれぞれ、一時間前、二時間前、三時間前・・・と200時間前までさかのぼったものを utime 関数を使ってセットする。ファイル名は epoc time そのもの。で、これを find に検索させて、どこが検索対象の境界になるかを調べようと言うわけだ。

$ perl -le 'for (1..200) { $fname = (time - $_ * 3600); open(FH, ">$fname"); print FH ''; close(FH); utime($fname, $fname, $fname); }'

いきなり200個のファイルを作っても結果の検証がしにくくなるだけなので、まずは 35個だけ作ってみる。

$ perl -le 'for (1..35) { $fname = (time - $_ * 3600); open(FH, ">$fname"); print FH ''; close(FH); utime($fname, $fname, $fname); }'

$ ls -ltr
total 35
-rw-r--r--  1 aqua なし 3 Jul  5 12:39 1120534797
-rw-r--r--  1 aqua なし 3 Jul  5 13:39 1120538397
-rw-r--r--  1 aqua なし 3 Jul  5 14:39 1120541997
-rw-r--r--  1 aqua なし 3 Jul  5 15:39 1120545597
-rw-r--r--  1 aqua なし 3 Jul  5 16:39 1120549197
-rw-r--r--  1 aqua なし 3 Jul  5 17:39 1120552797
-rw-r--r--  1 aqua なし 3 Jul  5 18:39 1120556397
-rw-r--r--  1 aqua なし 3 Jul  5 19:39 1120559997
-rw-r--r--  1 aqua なし 3 Jul  5 20:39 1120563597
-rw-r--r--  1 aqua なし 3 Jul  5 21:39 1120567197
-rw-r--r--  1 aqua なし 3 Jul  5 22:39 1120570797
-rw-r--r--  1 aqua なし 3 Jul  5 23:39 1120574397
-rw-r--r--  1 aqua なし 3 Jul  6 00:39 1120577997
-rw-r--r--  1 aqua なし 3 Jul  6 01:39 1120581597
-rw-r--r--  1 aqua なし 3 Jul  6 02:39 1120585197
-rw-r--r--  1 aqua なし 3 Jul  6 03:39 1120588797
-rw-r--r--  1 aqua なし 3 Jul  6 04:39 1120592397
-rw-r--r--  1 aqua なし 3 Jul  6 05:39 1120595997
-rw-r--r--  1 aqua なし 3 Jul  6 06:39 1120599597
-rw-r--r--  1 aqua なし 3 Jul  6 07:39 1120603197
-rw-r--r--  1 aqua なし 3 Jul  6 08:39 1120606797
-rw-r--r--  1 aqua なし 3 Jul  6 09:39 1120610397
-rw-r--r--  1 aqua なし 3 Jul  6 10:39 1120613997
-rw-r--r--  1 aqua なし 3 Jul  6 11:39 1120617597
-rw-r--r--  1 aqua なし 3 Jul  6 12:39 1120621197
-rw-r--r--  1 aqua なし 3 Jul  6 13:39 1120624797
-rw-r--r--  1 aqua なし 2 Jul  6 14:39 1120628397
-rw-r--r--  1 aqua なし 2 Jul  6 15:39 1120631997
-rw-r--r--  1 aqua なし 2 Jul  6 16:39 1120635597
-rw-r--r--  1 aqua なし 2 Jul  6 17:39 1120639197
-rw-r--r--  1 aqua なし 2 Jul  6 18:39 1120642797
-rw-r--r--  1 aqua なし 2 Jul  6 19:39 1120646397
-rw-r--r--  1 aqua なし 2 Jul  6 20:39 1120649997
-rw-r--r--  1 aqua なし 2 Jul  6 21:39 1120653597
-rw-r--r--  1 aqua なし 2 Jul  6 22:39 1120657197

よしできた。ls のオプションに指定した -ltr の意味は、-l がおなじみのパーミッションとタイムスタンプを表示の有効化、-t は「アルファベット順ではなく修正時刻 (inode の `mtime') でのソートの有効化、-r が逆順にするオプション。

ちなみに現在時刻と、実行環境と find のバージョンは以下の通り。
$ date
Wed Jul  6 23:40:41    2005

$ uname -a
CYGWIN_NT-5.1 a64 1.5.17(0.129/4/2) 2005-05-25 19:38 i686 unknown unknown Cygwin

$ find --version
GNU find version 4.2.11-CVS

で、find . -mtime +0 してみる。私の予想通りなら、24時間以上経過しているファイルのみが対象になるはずだ。

$ find . -mtime +0
./1120534797
./1120538397
./1120541997
./1120545597
./1120549197
./1120552797
./1120556397
./1120559997
./1120563597
./1120567197
./1120570797
./1120574397

うーん、これじゃ24時間以上経過したファイルかどうなのかがよくわからないよね。find の出力結果をファイル名じゃなくてタイムスタンプにしてみよう。

$ find . -mtime +0 -printf "%t\n"
Tue Jul  5 12:39:57 2005
Tue Jul  5 13:39:57 2005
Tue Jul  5 14:39:57 2005
Tue Jul  5 15:39:57 2005
Tue Jul  5 16:39:57 2005
Tue Jul  5 17:39:57 2005
Tue Jul  5 18:39:57 2005
Tue Jul  5 19:39:57 2005
Tue Jul  5 20:39:57 2005
Tue Jul  5 21:39:57 2005
Tue Jul  5 22:39:57 2005
Tue Jul  5 23:39:57 2005

うん、"Tue Jul 5 23:39:57 2005" のタイムスタンプを持つファイルは対象になっておらず、確かに現在時刻から24時間以上経過したものだけ対象になってるね。なんでこういう仕様なんだろう? 仕様さえわかればまあいいか。

テストを終えてふと思ったこと。ここまでテストするんだったら find のソースを読んだ方が早い気がする。周りから攻めようとするのはエンジニアらしくないよね。次からはソースを読むようにしよう。

2005-06-26 (Sun)

* cron 登録ジョブ crontab のバックアップ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix] [バックアップ]

ユーザレベルでの crontab のバックアップってどうするのがいいんだろう? /var/cron/tabs/USER_NAME をバックアップすればいいのかな? 一応コマンドでやるか。

~/etc に一日一回 crontab の中身をダンプする。
# crontab backup
8 0 * * * crontab -l >$HOME/etc/crontab_backup_`date +\%a`

date コマンドの引数の % の前に \ をつけているのは、crontab の場合 % を \% にエスケープする必要があるため。

Manpage of CRONTAB
http://www.linux.or.jp/JM/html/cron/man5/crontab.5.html
「第 6」フィールド (行の残りの部分) には実行されるコマンドを指定する。その行のコマンド部 (改行文字または % 文字まで) が /bin/sh (またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって実行される。コマンド中にパーセント記号 (%) がバックスラッシュ (\) によってエスケープされずに置かれていると、改行文字に置き換えられ、最初に現れた % 以降の全てのデータは標準入力としてコマンドに送られる。

ホームディレクトリは ~/tmp を除き丸ごとバックアップ。暗号化して他のマシンに転送。

2005-04-19 (Tue)

* Linux のシグナルの種類

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix] [Linux]

プロセスに送るシグナルの種類をメモ。

- シグナルってなに?

シグナルは、プロセスに対して送信するメッセージのようなもの。

apache などのデーモンを再起動するときに使う SIGHUP 1 や、プロセスを強制終了するときに使う kill -9 で有名な SIGKILL 9 などがある。シグナルの種類と番号の割り当て方にはいくつかの流派がある。POSIX シグナルとか SysVシグナルとか BSDシグナルなどがあるようだ。

Manpage of SIGNAL
http://www.linux.or.jp/JM/html/LDP_man-pages/man7/signal.7.h ...
Linux は POSIX 信頼シグナル (reliable signal; 以後 "標準シグナル"と表記) と POSIX リアルタイムシグナルの両方に対応している。

- POSIX シグナルの種類

http://www.linux.or.jp/JM/html/LDP_man-pages/man7/signal.7.h ...
POSIX.1 に定義されているシグナルを示す。

シグナル 値 動作 コメント
-----------------------------------------------------------
SIGINT  2 Term キーボードからの割り込み (Interrupt)
SIGQUIT  3 Core キーボードによる中止 (Quit)
SIGILL  4 Core 不正な命令
SIGABRT  6 Core abort(3) からの中断 (Abort) シグナル
SIGFPE  8 Core 浮動小数点例外
SIGKILL  9 Term Kill シグナル
SIGSEGV 11 Core 不正なメモリ参照
SIGPIPE 13 Term パイプ破壊: 読み手の無いパイプへの書き出し
SIGALRM 14 Term alarm(2) からのタイマーシグナル
SIGTERM 15 Term 終了 (termination) シグナル
SIGUSR1 30,10,16 Term ユーザ定義シグナル 1
SIGUSR2 31,12,17 Term ユーザ定義シグナル 2
SIGCHLD 20,17,18 Ign 子プロセスの一旦停止 (stop) または終了
SIGCONT 19,18,25  一旦停止 (stop) からの再開
SIGSTOP 17,19,23 Stop プロセスの一旦停止 (stop)
SIGTSTP 18,20,24 Stop 端末 (tty) より入力された一旦停止 (stop)
SIGTTIN 21,21,26 Stop バックグランドプロセスの tty 入力
SIGTTOU 22,22,27 Stop バックグランドプロセスの tty 出力

シグナル SIGKILL と SIGSTOP はキャッチ、ブロック、無視できない。

あれ? SIGHUP 1 が無いね。なんでだろう?

私が普段使うのはこのくらいかな。

SIGHUP 1 デーモンを再起動させたいときなど。
SIGINT 2 CTRL + C でプロセスを終わらせるときなど。
SIGKILL 9 kill -9 でプロセスを即座に強制終了させるとき。
SIGTERM 15 kill -15 を送ってプロセスを平和的に終わらせるとき。

kill -9 だとプロセスは問答無用で即終了するけど、kill -15 だとプロセスが自分の使ったテンポラリファイルやその他の資源の後始末をしてくれることが多い。

2004-12-13 (Mon)

* mkdir と rmdir の -p --parents オプション

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

mkdir (1) の man page を読んでいたら、-p --parents というオプションがあることに気づいた。指定されたディレクトリの親ディレクトリが無いときはそれも含めて作るオプション。

- mkdir の -p --parents オプション

Delphi 5で開発していた頃に ForceDirectories() という関数を使ったことがあるが、これと同じ様な働きをしてたなあ。

Manpage of MKDIR
http://www.linux.or.jp/JM/html/gnumaniak/man1/mkdir.1.html
-p, --parents
引き数に指定した各々の directory で、存在しない親ディレクトリも含めて作成する。作成された親ディレクトリのアクセス権は、 umask の値に `u+wx' としたものが設定される。すでに存在するディレクトリに対応する引き数は無視される。 (従って、ディレクトリ /a が存在する場合に `mkdir /a' とするとエラーとなるが、 `mkdir -p /a' とするとエラーにならない。)

-v, --verbose
作成したディレクトリごとにメッセージを表示する。このオプションは --parents を一緒に指定するととても役立つ。

やってみる。
$ mkdir -p -v test/test2/test3/
test
test/test2
test/test2/test3

$ ls -R
test

./test:
test2

./test/test2:
test3

./test/test2/test3:
なるほどー。これは便利だ。

- rmdir の -p --parents オプション

rmdir にも -p オプションがある。

特定ディレクトリ以下を一気に消したい場合は rm -rf しちゃうから、--parents オプションがあるなんて知らなかった。そもそも rmdir ってほとんど使わないな。rm -r と rmdir を使い分けた方がミスを防げて良いんだろうけど。

Manpage of RMDIR
http://www.linux.or.jp/JM/html/GNU_fileutils/man1/rmdir.1.ht ...
-p
指定した directory がパス名に複数の階層を持っている場合、それを削除し、最終のディレクトリ名を省略し、その結果のディレクトリを削除し、というふうにすべての階層が削除されるまで繰り返す。つまり、`rmdir -p a/b/c' は `rmdir a/b/c; rmdir a/b; rmdir a' と同じである。

なるほど。ということは、ディレクトリが空じゃないとダメなんだよね? やってみる。

$ mkdir -p test/test2/test3/

$ touch test/test2/test3/jama
test

./test:
test2

./test/test2:
test3

./test/test2/test3:
jama

$ rmdir -p test/test2/test3/
rmdir: test/test2/test3/: Directory not empty

あ、やっぱりダメだ。

2004-12-07 (Tue)

* Unix でテンポラリファイルを確実に消す方法

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

知らなかった。定番なのか。

[PHP-users 23600] Re: バージョンアップ後にunlinkでエラー
http://ns1.php.gr.jp/pipermail/php-users/2004-November/02412 ...
UNIX 系の OS では一時的に作成したテンポラリファイルを確実に
消す方法としては

    open 直後に unlink して、そのまま使いつづける

というのは定番的な tips だったりします。

  というのは、どれかのプロセスがそのファイルをオープンしていた場合、そ
のオープンしている最後のプロセスがファイルを close するまで、そのファ
イルは存在しつづけることが保証されるからです。確か POSIX でもそう決まっ
ていたはず。

  どういうときに嬉しいかというと、先ほども書いたようにプログラム内で一
時ファイルを作るときです。プログラム内で一時ファイルを使用終了したら
unlink するという処理でも良いのですが、それではエラーで終了するときに
もいちいち unlink しなければなりませんし、予想外の異常終了の場合は一時
ファイルが残ったままになってしまいます。open 直後に unlink しておけば、
例えどんなケースであれ、プロセスが終了したら確実にファイルは消去されま
す。

- Perl でテンポラリファイルを確実に消す方法を試してみる

Perl で試してみた。ファイルを作ってすぐに unlink で削除し、10秒待つ。その後ファイルの中身を print するワンライナー。
$ perl -e 'open(TMP, "+> tmpfile"); print unlink("tmpfile"); print TMP 256; sleep 10; seek(TMP, 0, 0);  print join("", <TMP>);'

上記を実行すると、確かに unlink しているのに読み書きができた。10秒の sleep 中に他のシェルから ls を発行したが、ファイルは無かった。

試したのは FreeBSD 4.10-RELEASE-p5 と perl v5.8.4 built for i386-freebsd-64int の環境。

- PHP-users はときどき役に立つ投稿がある

PHP-users メーリングリストは、ときどきこういう役に立つ情報がある。ほとんど読んでないし、もう購読やめようかなあと思ってるんだけど、こういうためになる投稿を見つけるたびにもうちょっと購読を続けようという気にさせられる。

以下のような投稿を見てちょっとショックを受けたりもした。

[PHP-users 23758] Re: DB の暗号化について
http://ns1.php.gr.jp/pipermail/php-users/2004-November/02427 ...
そもそも、80番ポートしか空いてない、WEBサーバの前に80番だけ通すFW置く意味はないし、
マルチホームな、WEBサーバの、プライベートセグメントに、さらに、DBのポートをあけた
FWを置いても仕方が無い.

ところが、1段でも、関所が多い方が,安心
というのですよ、エセコンサル屋は.

もちろん、FWも、ロードバランサも、壊れたら困るから2重化です.

DMZ という概念がない。外向きの接続は全部開放。外部からの接続のフィルタリングも、OS が持つファイアウォールだけで十分だという主張。

このコンサルの提案は正しいと思うんだけどなあ。どのマシンが乗っ取られたとしても被害を最小に抑えるには、境界にファイアウォールが必要。それに port 80しか開けてないのって本当なのかな。リモートからメンテしたりするなら、他も開けているはず。この提案が却下されるなんて、どんな案件なんだろう?

2004-11-07 (Sun)

* sendmail コマンド で envelope-from を指定する

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [メール] [unix]

ユーザーコマンド sendmail (1) で from を指定するには -f を使う。指定できる from は envelope from なので、ヘッダに from を入れたければ sedamail コマンドへの入力文字列中に From ヘッダを含めておかなければならない。

使用例。
$ cat mail_message |/usr/sbin/sendmail -oi -f from@infoseek.jp to@example.com

SENDMAIL(1) sendmail - Postfix Sendmail 互換インターフェース
http://www.kobitosan.net/postfix/jman/sendmail.1.html
-f sender
      エンベロープの送信者アドレスをセットします。これは
      メッセージが Errors-To: メッセージヘッダを含まない
      場合に配送の問題が送られる場所です。

なぜか私の Linux マシンには sendmail(1) の man page がインストールされてなかった。sendmail(8) の man page はある。仕方がないので、postfix の sendmail コマンドの man pageを参照。sendmail 互換コマンドと言ってるし、実際動いたのでこれでいいや。

2004-06-23 (Wed)

* cygwin で cron を使う

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ソフトウェア] [unix]

シェルスクリプトを一日一回定期実行したい。

Linux などの unix 系 OS なら簡単だが、今回は Windows2000 + cygwin 環境で動かしたい。Windows で夜間バッチや自動実行をさせるならタスクスケジューラや at を使うところ。しかし、今回はシェルスクリプトなのでそれらを使うと環境変数とかいろいろ落とし穴がありそう。というわけで、cygwin の cron を使うことにした。これなら問題ないはず。Windows のサービスとして動作させられるようだし、うってつけだ。

- cygwin で cron を使うには

Google で cygwin cron を検索すると、そのものズバリでとてもわかりやすいサイトがヒット。

Are You Cygwin Tonight? - cron
http://www.amy.hi-ho.ne.jp/tachibana/cygwin/cron.html

cygwin で cron を使うためにやるべきことは、
1. cron と cygrunsrv をインストール
2. cygrunsrv で cron をサービスとして登録
3. cygrunsrv で cron サービスを開始 (コントロールパネルのサービスからでも良いかも)
の3つ。あとは crontab -e でジョブを登録して無事完了。ちなみに cron サービスは OS 起動時に自動起動するようになっている。

以下のコマンドで cron を Windows のサービスとして登録。

$ cygrunsrv --install cron --path /usr/sbin/cron --args -D

以下のコマンドで cron サービスを起動。

$ cygrunsrv --start cron

以下のコマンドで cron サービスが起動しているかどうか確認。以下は Currnt State が Running なので起動している。

$ cygrunsrv --query cron
Service            : cron
Current State      : Running
Controls Accepted  : Stop
Command            : /usr/sbin/cron -D

そうそう、crontab -e でジョブの編集をするために、vim でも何でもいいからエディタを cygwin の setup.exe からインストールしておいた方が良い。cygwin を標準インストールしているとエディタが何もインストールされないからね。cron と cygrunsrv も標準ではインストールされないので、無かったら setup.exe からインストールしておくこと。

- cron が動いているかをテスト

cron に登録したジョブが正しく動くためには、以下を満たす必要がある。

・cron が動いているか
・crontab へのジョブ登録が正しく行われているか
・ジョブのコマンドラインが正しく記述されているか

これらを満たすテストをするには、/bin/date >>/tmp/crontest.txt などといったコマンドをジョブ登録してコマンドの出力をチェックするのが簡単だ。上記コマンドは、date コマンドを実行して /tmp/crontest.txt に追記するというものだ。動作すればファイルに日時が書き込まれるので、ジョブがいつ動いたかもチェックできる。

まずシェルから /bin/date >>/tmp/crontest.txt を実行して、crontab に登録するコマンドラインが正しく動作するかどうかをチェック。

コマンドラインからの実行が問題なかったら、crontab -e で以下のジョブを登録。
* * * * * /bin/date >>/tmp/crontest.txt
で、tail でファイルを監視。1分ごとに date コマンドの出力が書き込まれていれば無事動作していることになる。
$ tail -f /tmp/crontest.txt
Wed Jun 23 18:33:00    2004
Wed Jun 23 18:34:00    2004
Wed Jun 23 18:35:00    2004

うん、OK だね。

2004-06-20 (Sun)

* dd コマンドで CD から iso イメージを作成

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix] [メモ]

CD-ROM から iso イメージを作成。コマンド一発で超簡単。cygwin でもちゃんと動いた。
$ dd if=/dev/cdrom of=/cygdrive/u/cdrom_name.iso

Manpage of DD
http://www.linux.or.jp/JM/html/GNU_fileutils/man1/dd.1.html

mkisofs コマンドでもできるようだ。

@IT:CD-ROMの内容をISOイメージにするには
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/500cdrom2i ...

2004-06-04 (Fri)

* netnews サーバ INN のアクセス制御

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

友達にいきなり「ニュースサーバの設定を変えて、アクセスできるセグメントを増やして」と言われた。ネットワークを拡張してセグメントを増やしたところ、新しいセグメントからはニュースサーバにアクセスできなくなってしまったらしい。もう管理する人がいなくなってしまったニュースサーバだけど、今でも元気に動いているので活用している、root のパスワードはわかるからなんとかしてくれと頼まれた。

- 過去の遺産のニュースサーバ

OS は FreeBSD だそうだ。ログインして uname -a してみると以下が表示された。

FreeBSD news.example.com 3.3-RELEASE FreeBSD 3.3-RELEASE #0: Thu Sep 16 23:40:35 GMT 1999    jkh@highwing.cdrom.com:/usr/src/sys/compile/GENERIC  i386

FreeBSD には疎いが、とても古いということはわかる。うーん、セキュリティアップデートなんかもずっとやってないんだろうな。良くないなー。まあ、閉じた LAN の中だけで使われてるニュースサーバだし、いいか。
newtnews サーバは INN が使われているようだ。バージョンは確かめてない。

- INN を設定する

INN なんて使ったこと無いけど、アクセス制御は inetd か INN 自体の設定かファイアウォールのどれかで実現しているんだろう。

現在のアクセス規制の種類を見極めるため該当サーバの port 119 に telnet したところ、接続はできてプロンプトが返ってくるが購読や投稿ができない。これは INN 自体のアクセス制御だな。

Googleで INN netnews 設定 を検索したところ、nnrp.access が設定ファイルだとわかった。
続いて Google で nnrp.access を検索したところ、設定例などがたくさんヒットした。これで設定できるぞ。

/usr/local/news/etc/nnrp.access に設定を記述する。

10.157.30.0 と 10.231.31.0 に、全グループの閲覧 (Read)と投稿権限 (Post) を与える。ただし、control と junk は除く。
10.157.30.*:RP:::*,!control,!junk
10.231.31.*:RP:::*,!control,!junk

- 参考

INN-2.2.2
http://ucchi.avis.ad.jp/install/inn222.html
nnrp.access

nnrp(ニュースリーダのクライアント)接続の制限を行う。書式はhost:permission:user:pass:groupsとなっており、userとpassを指定すると、パスワード認証で読み書きするように設定できる。 permissionはR(Read)とP(Post)を指定できる。groupsはワイルドカードが利用でき、単純に * とした場合はすべてのグループを意味する。
*::::!*
stdin:Read Post:::*
localhost:Read Post:::*
127.0.0.1:Read Post:::*
202.247.192.*:Read Post:::*

nnrp.access の冒頭にちゃんと説明が書いてあった。
##  $Revision: 1.3.2.1 $
##  nnrp.access - access file for on-campus NNTP sites
##  Format:
##      <host>:<perm>:<user>:<pass>:<groups>
##      <host>:</path/file>
##  Connecting host must be found in this file; the last match found is
##  used, so put defaults first.
##      <host>          Wildcard name or IP address
##      <perm>          R to read; P to post
##      <user>          Username for authentication before posting
##      <pass>          Password, for same reason
##      <groups>        Newsgroup patterns that can be read or not read
##      </path/file>    A second file to scan in the same format as this
##  To disable posting put a space in the <user> and <pass> fields, since
##  there is no way for client to enter one.
##
## Default is no access, no way to authentication, and no groups.

2004-05-28 (Fri)

* 秒間隔でコマンドを繰り返し実行し続ける

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [シェルスクリプト] [unix]

ドロップパケットの数値を監視するため、netstat -i を1秒間隔で自動実行したい。

- while と sleep を使ってシェルスクリプトを書く

$ while true; do date; netstat -i; sleep 1; clear; done;

while で無限ループを作って sleep で間隔を入れている。日付を表示するために date を、毎回画面クリアするために clear を追加した。
単純だけどこれで十分。もちろん、sleep している間は CPU を消費しないので安心。

- watch コマンドを使う

$ watch --interval 1 netstat -i
これで1秒間隔で netstat -i を実行し、出力を画面に表示してくれる。ちなみに cygwin でも試してみようと思ったら watch コマンドがインストールされてなかった。

- 参考

2004-05-26 (Wed)

* ディレクトリ中のファイルサイズ合計値を バイト表示

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [シェルスクリプト] [unix]

Windows では、ディレクトリのアイコンを右クリックしてプロパティを表示させると、そのディレクトリ以下のファイルのサイズの合計値がバイト単位で表示される。併せて、ファイル数やクラスタギャップを含めたディスク上のサイズも表示される。ちなみに、プロパティは ALT + ディレクトリアイコンのダブルクリックでも表示される。

Linux や Unix のコマンドラインで操作しているときも、同じ情報を表示させたい。

- du じゃブロックサイズの表示なのでダメ

すぐに思いついたのは du コマンドだが、du はファイルサイズではなくファイルが使っているブロックサイズを表示するのでダメだ。-b オプションをつけてバイト単位で表示させても、ブロックサイズをバイト単位で表示するだけなので今回の目的には使えない。以下、実行結果。ls では 29バイトなのに du ではブロック1個分の 4096バイトになっているのがわかる。

$ date >date.txt
$ ls -l date.txt
-rw-r--r--    1 hiroaki  hiroaki        29 May 25 12:50 date.txt

$ du -b date.txt
4096    date.txt

ls や du の man を読んでみたが、一発で解決してくれるようなオプションは無かった。

Manpage of LS
http://www.linux.or.jp/JM/html/GNU_fileutils/man1/ls.1.html

Manpage of DU
http://www.linux.or.jp/JM/html/GNU_fileutils/man1/du.1.html

- コマンドを組み合わせて合計値を表示させる

こうなったらコマンドを組み合わせて望みの値を得るスクリプトを書くしかないでしょう。One Liner でも書けるかな。

特定ディレクトリ下を再帰的に検索するなら find の出番だ。man を見ると出力書式もかなり自由だし、いろいろできそう。find にファイルサイズを出力をさせて、それを合計してやればいいわけだ。合計くらいなら sh や bash などのシェルでもできそうだけど、パフォーマンス気にするわけでもないし、perl でいいか。文法調べるの大変だし。

Manpage of FIND
http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.htm ...

- ディレクトリを再帰的にたどって、ファイルの合計サイズを出力する。

$ find -type f -printf "%s\n" |perl -ne '$sum += $_; print "\r$sum"'
一気にカウントが増えていくとこがかっこいい。ガソリンスタンドで給油量のカウンタについ見入ってしまうみたいな感覚。

- ディレクトリを再帰的にたどって、ファイルの合計サイズを出力する awk 版。

でも 必要ないのに重い perl 使う理由は無いよね。awk でいいか。--help したらサンプル載ってたし。awk だと END っていうのがあるので、\r を使わずに書けるんだね。
$ find -type f -printf "%s\n" |awk '{sum += $1; printf "\r" sum };'
$ find -type f -printf "%s\n" |awk '{ sum += $1; }; END { print sum }'

- ファイルの個数とファイルサイズを表示。ファイルサイズは3桁ごとにカンマで区切る。

$ find -type f -printf "%s\n" |perl -ne '$i++; $byte += $_; $str = "\r$i files, $byte byte"; $str =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g; print $str'
カンマが入っただけでもかなり雰囲気が変わる。なんだか「日本の借金カウンタ」みたいな感じがする。

- 他に欲しい機能は・・・

あとは再帰的にディレクトリをたどって、ディレクトリ毎にそのディレクトリが持つ容量を表示する機能が欲しいかなあ。要するに、du みたいに表示してほしいってこと。上記スクリプトはカレントディレクトリの容量しか表示しないけど、それを一気にやる機能。必要になったら作ろう。

- このコマンドの名前をどうしよう?

du - disk usage に対抗して bu - byte usage ってのはどうだろう? いかん、私ってセンス無い。

2004-05-11 (Tue)

* lftp で FTP Over HTTP Proxy

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ftp] [unix]

2004-05-08 の 「lftp を使った ftp ミラーリングと便利機能」で試してみたいなと書いた FTP over HTTP proxy を使ってみた。以下、2004-05-08 から引用。

FTP over HTTP proxy support は、squid を http と ftp の proxy サーバとして使用している環境で有用だろう。IE や Mozilla などのブラウザからは proxy を使って ftp サイトにアクセスできるのに、windows の ffftp をはじめとする ftp クライアントでは proxy を利用できない、という現象がある。これは ffftp などが FTP over HTTP proxy に対応していないために起こる。lftp ならこれを解決できるようだ。

要するに ftp の proxy 越え。

- ftp プロキシと http プロキシの指定

まずは lftp が使うプロキシサーバを指定する。lftp は環境変数 ftp_proxy http_proxy https_proxy にセットされている値を proxy として使う。私は .bash_profile に以下のように記述している。

export http_proxy=http://10.24.1.242:24201/
export ftp_proxy=http://10.24.1.242:24201/
export https_proxy=http://10.24.1.242:24201/

lftp 起動後にコマンドでセットしたり、/etc/lftp.conf または ~/.lftprc または ~/.lftp/rc に書いておくこともできる。ただ、apt や wget、lynx なども同じ環境変数を見るので、環境変数にセットしておいた方がツールごとに設定しなおさなくて済むので楽だ。

- lftp で FTP Over HTTP Proxy を使うときは hftp

lftp は hftp スキームで URL を指定すると FTP Over HTTP Proxy を使う、という動きをするようだ。

ftp://ring.gr.jp/ に FTP Over HTTP Proxy で接続したいときは、hftp://ring.gr.jp/ と指定すればいい。

- cygwin 環境の lftp 2.6.10 なら問題なく動いた

無料ホームページスペースの geocities に FTP Over HTTP Proxy で接続してみる。

まずは cygwin 環境。HTTP セッションの流れを詳細に見たいので、-d を付けて lftp を起動。
$ lftp -d -u USER_ID,PASSWORD hftp://ftp.geocities.co.jp
lftp USER_ID@ftp.geocities.co.jp:~> put test.txt
---- Connecting to proxy 10.24.1.242 (10.24.1.242) port 24201
---- Sending request...
---> PUT ftp://USERID@ftp.geocities.co.jp/test.txt;type=i HTTP/1.1
---> Host: ftp.geocities.co.jp
---> User-Agent: lftp/2.6.10
---> Content-length: 192
---> Last-Modified: Wed, 15 May 2002 10:09:52 GMT
---> Authorization: Basic PASSWORD
---> Connection: close
--->
<--- HTTP/1.1 201 Created
<--- Server: Cache/2.4.7
<--- Mime-Version: 1.0
<--- Date: Thu, 13 May 2004 09:35:44 GMT
<--- Content-Type: text/html
<--- Content-Length: 341
<--- Expires: Thu, 13 May 2004 09:35:44 GMT
<--- X-Squid-Error: ERR_FTP_PUT_CREATED 0
<--- X-Cache: MISS from unknown
<--- Age: 3
<--- Connection: close
<--- Via: HTTP/1.0 hostname
<---
---- Closing HTTP connection
192 bytes transferred in 4 seconds (55b/s)

「--->」がサーバへ送っているデータ、<--- がサーバから返されたデータだ。うまくログインして PUT できている。なるほど、ftp アカウントのパスワードは Authorization ヘッダに入れて squid に送るわけだ。成功時の応答は HTTP レスポンス 201 か。普段は webdav なども使わないので 200番台は 200 OK 以外は見かけないけど、こんなコードがあったのか。

- TurboLinux 6.5 Server の lftp は 2.3.7 はうまく動かない

次は TurboLinux Server 6.5 で試す。cygwin 環境があるマシンは24時間稼働ではないので、できれば 24時間稼働で cron も使える Linux マシンで lftp を使いたい。ただ、このマシンにインストールされている lftp はちょっと古めのバージョンだ。

$ lftp -d  -u USER_ID,PASSWORD hftp://ftp.geocities.co.jp
lftp USER_ID@ftp.geocities.co.jp:~> put test.txt
---- Connecting to proxy 10.24.1.242 (10.24.1.242) port 24201
---- Sending request...
---> PUT ftp://USERID@ftp.geocities.co.jp/test.txt;type=i HTTP/1.1
---> Host: ftp.geocities.co.jp
---> User-Agent: lftp/2.3.7
---> Content-length: 903
---> Last-Modified: Fri, 20 Feb 2004 13:20:04 GMT
---> Authorization: Basic PASSWORD
---> Connection: close
--->
**** Hit EOF while fetching headers
---- Closing HTTP connection
---- Connecting to proxy 10.24.1.242 (10.24.1.242) port 24201
---- Sending request...
---> HEAD ftp://USERID@ftp.geocities.co.jp/test.txt;type=i HTTP/1.1
---> Host: ftp.geocities.co.jp
---> User-Agent: lftp/2.3.7
---> Authorization: Basic PASSWORD
---> Connection: keep-alive
--->
<--- HTTP/1.1 400 Unsupported FTP Method
<--- Date: Thu, 13 May 2004 09:35:04 GMT
<--- Via: HTTP/1.1 hostname
<--- Connection: close
<--- Cache-Control: no-store
<--- Content-Type: text/html
<--- Content-Language: en
<--- Content-Length: 353
<---
---- Closing HTTP connection
copy: put rolled back to 0, seeking get accordingly
Interrupt

うまくいかない。HTTP の 400番が返ってきてしまう。上記ではわからないが、実際には 400 が返ってきた後 lftp はリトライするためのカウントダウンに入ってしまい、何度でもやり直そうとしていた。仕方がないので CTRL + C で止めた。Interrupt はそのときの表示だ。

ぱっと見では同じリクエストを送ってるようなんだけどなあ。Content-length が違うのは、別のファイルを送っているからだけど、これが影響するとは思えないし。やっぱり lftp のバージョンが古いのが良くないのかな。 確か lftp は2003年末くらいにセキュリティホールが見つかっていたはずだし、最新版を入れてみるか。

- lftp 3.0.3 をインストールして再挑戦

ミラーサイトから tar ball を取ってきてコンパイル & インストール。

tar zxvf lftp-3.0.3.tar.gz
cd lftp-3.0.3/
./configure
make
su
make install

トラブル無くインストール完了。では再び lftp。

$ lftp -d  -u USER_ID,PASSWORD hftp://ftp.geocities.co.jp
lftp USER_ID@ftp.geocities.co.jp:~> put test.txt
---- Connecting to proxy 10.24.1.242 (10.24.1.242) port 24201
---- Sending request...
---> PUT ftp://USER_ID@ftp.geocities.co.jp/test.txt;type=i HTTP/1.1
---> Host: ftp.geocities.co.jp
---> User-Agent: lftp/3.0.3
---> Content-length: 903
---> Last-Modified: Fri, 20 Feb 2004 13:20:04 GMT
---> Authorization: Basic PASSWORD
---> Connection: close
--->
<--- HTTP/1.1 201 Created
<--- Server: Cache/2.4.7
<--- Mime-Version: 1.0
<--- Date: Thu, 13 May 2004 10:07:29 GMT
<--- Content-Type: text/html
<--- Content-Length: 341
<--- Expires: Thu, 13 May 2004 10:07:29 GMT
<--- X-Squid-Error: ERR_FTP_PUT_CREATED 0
<--- X-Cache: MISS from unknown
<--- Age: 4
<--- Connection: close
<--- Via: HTTP/1.0 hostname
<---
---- Closing HTTP connection
903 bytes transferred in 4 seconds (231b/s)

あ、できた。やっぱりバージョンが古かったのが良くなかったのかな。lftp の ChangeLog を見ても今回のトラブルに関連する修正履歴は見つけられなかったけど、使えるようになったので深く考えないことにしよう。個人的な用途にしか使わないだろうしね。

- lftp --help の日本語訳

--help だけは日本語化されてたのでメモ。man は残念ながら英語版のみだった。
$ lftp --help
使い方: lftp [OPTS] <site>
`lftp' は rc ファイルを読み込んだあと最初に実行されるコマンドです
-f <file>          ファイルで指定されたコマンドを実行し終了する
-c <cmd>            コマンドを実行して終了する
--help              このヘルプを表示して終了する
--version          lftp のバージョンを表示して終了する
他のオプションは `open' コマンドのものと同じです
-e <cmd>            選択のすぐあとに指定のコマンドを実行する
-u <user>[,<pass>]  認証で指定のユーザ/パスワードを使う
-p <port>          接続に指定のポートを使う
<site>              ホスト名、URL あるいはブックマーク名

2004-05-08 (Sat)

* lftp を使った ftp ミラーリングと便利機能

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ftp] [unix]

lftp は高機能な ftp クライアント。

- lftp オフィシャルサイト

LFTP - reliable ftp client
http://lftp.yar.ru/

オフィシャルサイトの Feature list と Man page を読めば、ftp 関連でやりたいと思うことは lftp でたいてい実現できることがわかる。

Feature list http://lftp.yar.ru/features.html
Man page http://lftp.yar.ru/lftp-man.html

Feature list から、対応しているプロトコルを引用。他にもいろいろ書いてあった。
http://lftp.yar.ru/features.html
*  FTP and HTTP protocols support.
*  FTP (e.g. TIS FWTK) proxy support.
*  HTTP proxy support.
*  FTP over HTTP proxy support (hftp).
*  HTTPS and FTPS protocols support using OpenSSL library.
*  Automatic OPIE/SKEY support in FTP protocol.
*  FXP transfers support (between two FTP servers, bypassing client machine).
*  FTP listings support: unix-style, NT, EPLF.
*  Automatic reconnect and retry of an operation on retriable errors or timeout.
*  IPv6 support in both FTP and HTTP.
*  FISH protocol support. It uses ssh with no special program on server side.
*  SFTP protocol v3 and v4 support.
*  HTTP/1.1 keep-alive support.
*  Experimental support for SRV DNS records.
*  SOCKS support (configure option).

- インストール

lftp はたいていの Linux ディストリビューションに含まれているようで、最初からインストールされていることが多い。私の cygwin にはインストールしていなかったが、cygwin 用 lftp のパッケージが用意されていて、cygwin の公式インストーラからインストールできた。cygwin の setup.exe http://www.cygwin.com/setup.exe を起動して lftp を選ぶだけだ。

- 私の lftp コマンド

ローカルのファイル群を infoseek に ftp ミラーリングアップロードしている。
$ lftp -c "open ftp.isweb.infoseek.co.jp && user USER_NAME PASSWORD && lcd /home/hiroaki/public_html/log && cd / && mirror -R -I 2002* & mirror -R -I 2003* & mirror -R -I 2004* && mirror -R -i '^dat.*|^cat.*|^all.*|^cl.*|^i.*'"

- lftp の便利な機能1 ミラーリングアップロード とミラーリングダウンロード

要するにローカルとリモートのファイルを同期させる機能。普通の無料ホームページサービスは ftp くらいしかアップロードする方法がない。rsync が使えるなら rsync で良いけど、rsync を使える無料ホームページサービスは少ないだろう。ミラーリングが使えるとローカルで html の出来をチェックしさえすれば、同じものがサーバにも置かれることになるのでとても便利だ。

ミラーリング時のオプションも豊富だ。ローカルに存在しなくてミラー先にのみ存在するファイルを削除するかどうか指定できるし、ミラーリング対象ファイルを正規表現で絞り込んだり、タイムスタンプで比較して新しいファイルのみをミラーしたりと、かゆいところに手が届くような機能ばかりだ。

以下 man page から抜粋。
http://lftp.yar.ru/lftp-man.html
mirror [OPTS] [source [target]]

Mirror specified source directory to local target directory.
If target directory ends with a slash, the source base  name
is  appended  to target directory name. Source and/or target
can be URLs pointing to directories.

    -c, --continue      continue a mirror job if possible
    -e, --delete        delete files not present at remote site
        --delete-first      delete old files before transferring new ones
    -s, --allow-suid        set suid/sgid bits according to remote site
        --allow-chown        try to set owner and group on files
        --ignore-time        ignore time when deciding whether to download
        --ignore-size        ignore size when deciding whether to download
        --only-missing      download only missing files
    -n, --only-newer        download only newer files (-c won't work)
    -r, --no-recursion      don't go to subdirectories
    -p, --no-perms      don't set file permissions
        --no-umask      don't apply umask to file modes
    -R, --reverse      reverse mirror (put files)
    -L, --dereference        download symbolic links as files
    -N, --newer-than=SPEC    download only files newer than specified time
    -P, --parallel[=N]      download N files in parallel
        --use-pget[-n=N]    use pget to transfer every single file
    -i RX, --include RX include matching files
    -x RX, --exclude RX exclude matching files
    -I GP, --include-glob GP include matching files
    -X GP, --exclude-glob GP exclude matching files
    -v, --verbose[=level]    verbose operation
        --log=FILE      write lftp commands being executed to FILE
        --script=FILE  write lftp commands to FILE, but don't execute them
        --just-print, --dry-run  same as --script=-
        --use-cache          use cached directory listings
    --Remove-source-files    remove files after transfer (use with caution)
    -a            same as --allow-chown --allow-suid --no-umask

- lftp の便利な機能2 ミラーリング時の自動再試行

http://lftp.yar.ru/features.html
Automatic reconnect and retry of an operation on retriable errors or timeout.
自動再試行は便利だ。致命的でないエラーの時とタイムアウトの時は自動でリトライする。つまり、回線やサーバの ftpd が不安定だったりするときは自動でリトライしてくれる。この機能は非常にうれしい。infoseek の ftpd は混雑時は不安定になりがちだが、自動リトライ機能のおかげで安心して ftp できる。自動再試行についても、再試行回数や再試行間隔などのオプションが用意されている。詳細は man page を参照。

- lftp の便利な機能3 スクリプトファイルによる自動実行

ftp セッション中に実行したいコマンドをあらかじめ記述しておき、それを lftp に渡せば実行してくれるというもの。2003-12-01 に書いた「ftp: ftp + tar + cron で自動ネットワーク・バックアップ」で利用している機能だ。cron と組み合わせると定型的な作業を自動化できる。

- lftp の便利な機能4 ジョブ制御

シェルに似たジョブの制御ができる。コマンドの最後に & を付けるとバックグラウンド実行になる。私の lftp コマンドでも & を付けているが、どこまで効果があるかは不明。複数の ftp セッションを開いて並行にアップロードしているのかどうか確かめてはいない。あとで確認しよう。

- 他にも機能がいっぱい

lftp はとにかく高機能。man もそれだけ長いが、読む価値はある。perl や ruby で独自に ftp クライアントを実装するよりも、lftp を使った方が早くて確実だ。

以下、そのうち試したい機能。
FTP over HTTP proxy support (hftp).
`pget' to download a file using several connections.

FTP over HTTP proxy support は、squid を http と ftp の proxy サーバとして使用している環境で有用だろう。IE や Mozilla などのブラウザからは proxy を使って ftp サイトにアクセスできるのに、windows の ffftp をはじめとする ftp クライアントでは proxy を利用できない、という現象がある。これは ffftp などが FTP over HTTP proxy に対応していないために起こる。lftp ならこれを解決できるようだ。

追記。FTP over HTTP proxy support によるプロキシ越えは 2004-05-11 で実際に試してみた。

2004-05-03 (Mon)

* cygwin の nice コマンド

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

当サイトは ChangeLog メモ を chalow で html に変換させて生成している。本家 chalow からいろいろ拡張したせいか、Celeron 500MHz の私のマシンではちょっと重い。ネットワーク通信を要する部分はキャッシュをできるだけ使うように実装したが、それでも遅い。time コマンドで所要時間を計ると、920KB の ChangeLog ファイルを変換するのに一分から一分半ほどかかっているようだ。

chalow が動いている間 CPU は100%フル稼働しているわけで、他のアプリケーションの応答が悪くなる。ブラウザ程度なら多少反応が悪くなってもまだ許せるが、winamp や CD-R ライティングソフトといったアプリケーションにとって、バッファアンダーランの発生は致命的だ。気分良く音楽を聴いているのに、音飛びが発生してしまっては興ざめ。もっと速い CPU を買えばいいんだけど、それじゃあエンジニアらしくない。何か対策を考えて、それでもダメな場合であればハードウェアに投資するのは全然問題ないが、いきなり力業に頼るのは美しくない。

- cygwin の nice コマンドは「優先度を最低にする」機能のみサポート

前置きが長くなってしまったが、結局 chalow のプロセスのプライオリティを下げてやれば良いわけだ。Unix だと nice コマンドによるプロセスの優先度の制御をよく使う。cygwin でも使えるんだろうか? まず which でコマンドがあるか確かめてみる。

$ which nice
/usr/bin/nice
おお、ちゃんと入ってる。じゃあ sleep コマンドでテスト。

$ nice sleep 1000
上記コマンドを実行してタスクマネージャで基本優先度のカラムを表示させると、Windows のスケジューラでの優先度は「低」になっている。効いてる効いてる。「低」は確か Windows のスケジューラで一番低い優先度だったはずだ。

じゃあ 19 を指定して・・・って、ちょっと待て。引数なしの nice で「低」になるんだったら、最低の優先度指定である 19 を指定するとどうなるんだろう?
$ nice 19 sleep 1000
nice 19 でも、やっぱり「低」。ひょっとして引数を指定しても無意味? 最高優先度の -20 だとどうだろう? いきなりコレをやるのはちょっと怖い。1000秒間 OS が反応しなくなるのは怖いので、sleep する時間は 100 にしておこう。
$ nice -20 sleep 100
nice -20 だから「リアルタイム」になるかと思ったのに、またしても「低」。やっぱり引数は無視されているようだ。

nice --help すると -20 から 19 までの範囲があるよって書いてあるけど、それは cygwin では関係ないのかな。
$ nice --help
Usage: nice [OPTION] [COMMAND [ARG]...]
Run COMMAND with an adjusted scheduling priority.
With no COMMAND, print the current scheduling priority.  ADJUST is 10
by default.  Range goes from -20 (highest priority) to 19 (lowest).

  -n, --adjustment=ADJUST  increment priority by ADJUST first
      --help    display this help and exit
      --version  output version information and exit

Report bugs to <bug-sh-utils@gnu.org>.

Google で cygwin nice 優先度を検索するとヒット。

Gnuwin32 Applcation
http://www.asahi-net.or.jp/~JC5M-OOTK/cygwin/gnuwin32.html
nice 指定したプロセスの優先順位を最低に変える

あ、やっぱりそうなんだ。

- cygwin API はインターフェイスを持っているようだ

検索結果を眺めていたら、cygwin の API のドキュメントがあった。

その他の標準との互換性
http://www.sixnine.net/cygwin/cygwin-doc/cygwin-api-int/std- ...
nice は本関数の incr 引数を使用することによって、 Cygwin プログラムに対して現在の実行優先度の変更を許可します。 Cygwin プロセスは nice 呼び出しに対し、 IDLE_PRIORITY_CLASS、NORMAL_PRIORITY_CLASS、 HIGH_PRIORITY_CLASS 又は REALTIME_PRIORITY_CLASS を指定出来ます。 NORMAL_PRIORITY_CLASS がデフォルトです。 nice() に対して正値を指定すると、優先度は(先の優先度リスト中で)一つ減少します。負値の指定は優先度を一つ増加させます。呼び出しを繰り返し行わない限り、一度に一つ以上優先度を変更することは出来ません。 REALTIME_PRIORITY_CLASS 以上に増加させた場合、プロセスはその優先度に留まります。同様に、IDLE_PRIORITY_CLASS 以下に減少させた場合もその優先度に留まります。 Win32 API には 32 の優先度が存在することに注意して下さい。現在のところ、nice を通してはそれらのうちの 4 つにしかアクセス出来ません。

API はインターフェイスを持ってるけど、nice コマンドは優先度を最低にする部分しか使っていないだけのようだ。

- 優先度を最低にするだけでも十分

私の用途では細かく優先度をコントロールする必要はないから、この実装で十分。chalow を呼び出しているシェルスクリプトに nice を組み込んで、と。うん、快適快適。

2003-09-16 (Tue)

* bit version UNIX Frequently Asked Questions

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

http://www.ne.jp/asahi/tao/elis/bitfaq/
内容は古いが普遍的。読み物としてはいいんじゃないかな。

2003-04-26 (Sat)

* ln コマンドでシンボリックリンク作成

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [unix]

TARGET へのリンクを DIRECTORY に作成する。いつも TARGET と DIRECTORY の順番で迷ってしまうのでメモ。

$ ln -s TARGET DIRECTORY

man ln によると、TARGET だけを指定したときはカレントディレクトリに TARGET へのリンクを作成するとのことなので、一引数だけの指定をした方が良いかもしれない。

2003-04-16 (Wed)

* n 日以前のタイムスタンプを持つファイルを消す

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

$ find /home/postgres/dbbackup -type f -daystart -mtime +n |xargs /bin/rm -f

-mtime +n の n に日数を指定できる。find って便利だね。
cron で毎日実行すれば、毎日ディレクトリを監視して一定期間を過ぎたファイルを消す、ということができる。

2003-03-26 (Wed)

* xargs で再帰的 grep

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

問題: カレントディレクトリ以下には、複数個、複数階層のディレクトリがある。
その中にある特定の条件を持つファイルに grep をかけたい。

解答: find . |grep .0$ |xargs grep 'search string'
find でとりあえず全ファイルをリストアップし、grep で特定ファイルを絞り込む。
さらにそれを xargs に渡し、grep のコマンドラインを作って実行する。
このとき作成されるコマンドラインは、
grep 'search string' foo.0 bar.0 buzz.0
といったものになる。
grep 'search string' foo.0; grep 'search string' bar.0; grep 'search string' buzz.0;
とはならないため、複数のプロセスが大量に起動される、という事態を避けられる。

- 追記。

上記のような面倒なことをしなくとも、grep -r で再帰的に grep できる。

2003-03-18 (Tue)

* mv コマンドとディレクトリの指定

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

JM の mv より抜粋。
http://www.linux.or.jp/JM/html/gnumaniak/man1/mv.1.html
最後の引き数がすでに存在しているディレクトリならば、mv は指定したファイルを同じ名前でそのディレクトリに移動する。一方、2 つのファイルしか指定されない場合、 1 番目のファイル名を 2 番目のファイル名に変更する。

最後の引数がディレクトリでなく、 3 つ以上のファイルが指定された場合はエラーとなる。

したがって `mv /a/x/y /b' とすると、ディレクトリ /b がすでに存在する場合は /a/x/y を /b/y という名前に変更する。/b が存在しない場合は /b という名前に変更する。

ディレクトリを移動するとき、移動先が存在するかどうかでその動作が変わるのがポイント。

2003-03-18 (Tue)

* ディスク空き容量チェック&メールスクリプト

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

df を実行し、閾値を超えていたらメールする perl スクリプト。
[linux-users: 20178] Disk Usage check script より。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/~poffice/mail/l ...
マシン台数が多ければ SNMP を使って集中的に管理するところだが、いまのところはこれで十分。

2003-03-17 (Mon)

* /dev/null の破壊と復旧

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

非常にまずい。間違って /dev/null を消してしまった。

以下の質問を 2ch.net に投げてみた。
http://pc.2ch.net/test/read.cgi/linux/1047096767/691
間違って root で
# mv /tmp/log.txt > /dev/null
してしまい、/dev/null を上書きしてしまいました。

/usr/src/linux/Documentation/devices.txt を参考に、
# mknod /dev/null c 1 3
# chmod 666 /dev/null
として作成したのですが、これで良かったのでしょうか?

結局回答はもらえなかったが、問題なく動いているのでこれでいいのだろう。

追記。
JM の NULL のマニュアル
http://www.linux.or.jp/JM/html/LDP_man-pages/man4/null.4.htm ... によると、上記方法で良いみたい。

以下のようにすれば一行で書ける。
mknod -m 666 /dev/null c 1 3

2003-03-04 (Tue)

* cron の仕組み

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

システム設定ファイルを知ろう〜/etc/crontab〜
http://www.itmedia.co.jp/help/tips/linux/l0350.html
/etc/crontab が大本の設定ファイル。

2003-01-31 (Fri)

* ユーザ追加 unix コマンド useradd

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix]

- useradd を使う。adduser は useradd へのシンボリックリンク。いつも混同するけど。

オプション-G group[,...]] でグループを指定できる。
パスワードは passwd を使って変更。password はパスワードを生成するコマンドで、
変更するコマンドではないので注意。

- ユーザアカウント情報の修正

グループに所属したいときなど、アカウントを修正したいときは usermod を使う。

- 各アプリケーション毎のユーザ設定

proftpd をスタンドアローンで起動している場合、restart する必要あり。
postgres を使いたいなら、createuser で postgres のユーザとしても登録する。
samba を使いたいなら、samba の設定によってはパスワードの登録が必要。

2002-09-02 (Mon)

* sendmail コマンドで to を指定する

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [メール] [unix]

/usr/sbin/sendmail -t saitou-hiroaki@example.com

2004-11-07 追記。どうやら間違ってたみたい。

SENDMAIL(1) sendmail - Postfix Sendmail 互換インターフェース
http://www.kobitosan.net/postfix/jman/sendmail.1.html
-t    メッセージヘッダから受信者を抽出します。a
      これはコマンドラインで受信者が指定されなかった場合に必要です。


すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。