UNIX系 Q&A 2


Index
  1. syslog に 「ttloop: peer died: Success」とあったが、これは何?
  2. Linux で、仮想+実記憶を超えたメモリを獲得できるみたいだが?
  3. KISS policy って何?
  4. ポストスクリプトの文書を、テキストファイルに変換するツールはないか?
  5. texi という拡張子の付いたファイルを読むには?
  6. テキストファイルの改行コードを取り除いて 1 行だけにするには?
  7. あるプログラムだけを root 権限で動かすには?
  8. Biff って何の略?
  9. プログラムを起動してログアウトすると、そのプログラムは終了するのか?

1. syslog に 「ttloop: peer died: Success」とあったが、これは何?

ttloop というのは telnet のネゴの時に呼ばれる、network からの入力を担当するルーチンである。そして、「ttloop: peer died: Success」になるのは、read の返り値が 0 つまり EOF の時である。

要するに、telnet のネゴ中にクライアントが socket を shutdown したということ。おそらくクライアントは port 23 につながるかのを確認するだけのプログラムなのだろう。


2. Linux で、仮想+実記憶を超えたメモリを獲得できるみたいだが?

現代的な UNIX では、swap + memory - (mfs など) のサイズがトータルの仮想記憶容量になり、確かに Linux はトータルの仮想記憶容量を超えた分のサイズを獲得できる。これは、乱暴な言い方をすれば、Linux はトータルの仮想記憶容量超過のチェックをさぼっているからと言える。

そして、仮想記憶容量を超えた分のメモリにアクセスすると Segmentation fault になる。獲得時に上記のチェックを行った方が安全ではあるが、巨大なアドレスをとって実際にアクセスするのはその一部、というアプリケーションが動かせるという点では Linux にも利点はある。

Linus 氏は「当面 直すつもりは無い」といったことを news に書いているそうである。「4MB RAM のノートパソコンで emacs が子プロセスを fork してもちゃんと動くのが Linux の良いところなんだ」そうである。

Linux は fork 時にも swap 容量チェックをせず、copy-on-write で lazy に割り当てる。sbrk, mmap, fork 等々の後で copy-on-write で lazy に割り当てるメモリを「実際に全部割り当てられると仮定して」サイズのチェックをするのはあまりにも悲観的だという事だろう。

Linux はプロセスのページとバッファキャッシュは一応別物で、割合は動的に変わる。Linux 内部でメモリ管理の基本になっている copy-on-write の実装と、mmap ベースになっていないファイルシステムのバッファの扱いの絡みから、「今の空き容量」を知るのは困難だと思われる。

よって、何か重要なデーモンプロセスがあって、fork や malloc が正常に終了したのに (fork や malloc 後、あるページに初めて書き込んだ時に) 他のプロセスがメモリを食い尽くしたせいで死んでしまう可能性がある。こうした振舞いを Linux の欠点であると考える人もいる。

ただし、こうした振る舞いは NetBSD の UVM も、4.4BSD の仮想記憶もほぼ同じである。


3. KISS policy って何?

JARGON FILE 4.0.0によると

  :KISS Principle: /kis' prin'si-pl/ /n./  "Keep It Simple,
     Stupid".  A maxim often invoked when discussing design to fend off
     {creeping featurism} and control development complexity.
     Possibly related to the {marketroid} maxim on sales
     presentations, "Keep It Short and Simple".

「馬鹿みたいに単純にしておけ」、「シンプルなままにしとけって、バカ」といった意味になるだろうか。あるプログラムが「Stupid」であるという感覚、それをよしとする感覚は、UNIX コミュニティーでは当初から多くの人々に共有されていた感覚である。

「stupid」は「馬鹿」というより「気が利かない」と訳したほうが近いかもしれない。気の利いたことをしてくれるプログラムは他のものと組み合わせるとかえって使いにくいことが多い、というようなニュアンスが背後にあるのだろう。

たとえば ls が出力をきれいにしたり端末を制御してくれたりしたら、ls だけを使っているぶんには気持ちいいかもしれないが、出力をどこかにとっていろいろ変形して使おうとしたときに面倒になるに違いない。


4. ポストスクリプトの文書を、テキストファイルに変換するツールはないか?

pstotextというのがある。ps ファイルや pdf ファイルからテキストを抽出するもの。Ghostscript の Ver3.33 以降といっしょに使用する。

http://www.research.digital.com/SRC/virtualpaper/pstotext.html


5. texi という拡張子の付いたファイルを読むには?

これは texinfo 形式といって、GNU のミラーサイトから texinfo-3.12 を入手してインストールすると、以下の 2つのことができるようになる。

  1. makeinfo コマンドを使って info ファイルを生成する。
  2. TeX を利用して texi2dvi コマンドで印刷可能な形式へ変換する。

1 つのドキュメントから、オンライン形式と印刷形式の両方を生成することができるので、ある意味便利。

また、texi2html で変換して Web browser で読むという手もある。
http://www.mathematik.uni-kl.de/~obachman/Texi2html/


6. テキストファイルの改行コードを取り除いて 1 行だけにするには?

例えば ...

などで可能。

*) awk の ORS は出力レコードセパレータを意味するシステム変数で、デフォルトで "\n" になっている。それを空にしてしまえば、print 時に改行文字がつかない。


7. あるプログラムだけを root 権限で動かすには?

そのプログラムを root で setuid する方法がある。
  chown root hoge
  chmod u+s hoge

そうすればプログラム中に setuid() することで完全に root 権限を得ることが出来る。しかし、何の権限もなしに root の権限を持つので、プログラムできっちり制御しなくてはならない。

setuid プログラムとその制御の例として、以下のものがある。

su … 変更するユーザのパスワードを求める
passwd … そのユーザのパスワードの変更だけを行なうようにプログラムで制御

逆に mount などは普通のユーザには触らせたくないので setuid しない。


8. Biff って何の略?

何の略でもない。犬の名前である。

Biff は Heidi Stettner の犬の名前で、郵便配達人が来るとワンワン吠えていた。それが転じてメールが来るとわかるようにしてくれる奴という意味で biff という名前が付いた。

FreeBSD の man biff より、

HISTORY
     The biff command appeared in 4.0BSD. It was name after the dog of Heidi
     Stettner. He died in August 1993, at 15.

9. プログラムを起動してログアウトすると、そのプログラムは終了するのか?

shell 次第である。

ログアウトするということは端末が無くなるわけであり、その端末から起動しているプロセス達に対して、端末を握っているシェルからシグナルとして SIGHUP が通知される。SIGHUP のデフォルト動作はプログラムの終了なので、特に対処をしていないプログラムはそのまま終了する。例えば、本物の /bin/sh は、バックグラウンドで走らせるプロセスも自分と同じプロセスグループにしたままなので、ログインシェルが終る際に SIGHUP が送られる。

起動したプログラムがデーモンとして作られていて制御端末を切り放していたり、プログラムを nohup コマンドとして起動することで SIGHUP を送らせず、特に SIGHUP に対処していないプログラムを終了させないことができる。現在のほとんどのシェルは、バックグラウンドで起動する場合には nohup になるようになっているが、あらゆる環境でこうなっているとは限らない。




Index