2. 短い tips

2.1. お手軽 Syslog トリック 〜Tips-HOWTO 管理人 Paul Anderson

/etc/syslog.conf を編集して、次の行を入れます。

  # Dump everything on tty8
  *.*					/dev/tty8

注意事項:必ず Tab を使うこと! syslog はスペースを 嫌います.....

2.2. 圧縮された HOWTO 文書を表示するスクリプト 〜Didier Juges, <dj@destin.nfds.net>

初心者のわたしから同じく初心者のひと向けに、HOWTO 文書の検索と表示が簡単に できる短いスクリプトを紹介します。たとえば、わたしの環境だと HOWTO 文書は /usr/doc/faq/howto/ に圧縮されて入っています。ここで、文書の ファイル名は、XXX-HOWTO.gz であり、XXX の部分はその題名 とします。わたしは、次のような "howto" というスクリプトを作成して、/usr/local/sbin に置きました。

  #!/bin/sh
  if [ "$1" = "" ]; then
      ls /usr/doc/faq/howto | less
  else
      gunzip -c /usr/doc/faq/howto/$1-HOWTO.gz | less
  fi

引数なしでコマンドを実行すると、ディレクトリ内にある HOWTO 全部を表示します。 次に、引数としてファイル名の最初の部分(ハイフンより左側)を入力すると、 (もとの文書自体には変更を加えずに)その文書を解凍して、表示します。

たとえば、Serial-HOWTO.gz を表示する場合は、次のように 入力します。

  $ howto Serial

2.3. 空きスペースは充分か??? 〜Hans Zoebelein <zocki@goldfish.cube.net>

マウントされているデバイス(ディスク、CD-ROM、フロッピー...)上に充分な空き スペースがあるかどうか定期的にチェックする短いスクリプト。

空きスペースが無くなると、X 秒ごとにメッセージが表示され、満杯のデバイスが 生じるたびに 1 通のメールが届きます。

  #!/bin/sh

  #
  # $Id: Tips-HOWTO.sgml,v 1.4 2001/07/21 14:58:17 senda Exp $
  #

  #
  # ディスクが一時ファイルで満杯になると、コンパイル中に奇妙なメッセージが
  # 表示されるようになったので、これを書いて、ディスクが満杯になる前に警告
  # が表示されるようにした。
  #
  # このスクリプトで君のサーバが爆発を免れたなら、僕にお礼のメールを
  # 送ってちょうだい zocki@goldfish.cube.net
  # このスクリプトで君のサイトが全滅したなら、お気の毒ですが、おいしい
  # 話はそうないものです。責任は負えません。
  # sed の扱いに習熟されている方、おおめに見てださい。:)
  #

  #
  # 自動化する方法:rc.local に 'check_hdspace &' と記述すること。
  # $SLEEPTIME 秒ごとにディスク上の空きスペースをチェックします。
  # フロッピーやテープドライブもチェックできます。:)
  # 空きスペースが $MINFREE (kb) 以下になると、警告メッセージを表示し、
  # 問題のあるデバイスごとに 1 通のメールを $MAIL_TO_ME に送信します。
  # 基準値以上の空きスペースが確保されると、再度スペース不足になった
  # 場合に備えて、メール送信機能が準備されます。
  #

  # TODO: デバイスごとに異なる $MINFREE を設定できるようにすること。
  # 空きスペースがなくなった場合、/*tmp ディレクトリのゴミファイルを
  # 掃除して、空きスペースを作るようにすること。


  DEVICES='/dev/sda2 /dev/sda8 /dev/sda9'         # デバイス; ディスクの設定
  MINFREE=20480                                   # kb; これ以下で警告表示
  SLEEPTIME=10                                    # 秒; チェックの間隔
  MAIL_TO_ME='root@localhost'                     # 誰か; 警告メールの送信先


  # ------- これ以下の部分は、変更する必要がありません (希望) :) -------

  MINMB=0
  ISFREE=0
  MAILED=""
  let MINMB=$MINFREE/1024         # yep, we are strict :)

  while [ 1 ]; do
          DF="`/bin/df`"
	          for DEVICE in $DEVICES ; do
		  ISFREE=`echo $DF | sed s#.\*$DEVICE" "\*[0-9]\*""\*[0-9]\*" "\*## | sed s#" ".\*##`
		
		  if [ $ISFREE -le $MINFREE ] ; then
			  let ISMB=$ISFREE/1024
			  echo  "WARNING: $DEVICE only $ISMB mb free." >&2
			  #echo "more stuff here" >&2
			  echo -e "\a\a\a\a"
			
		 	  if [ -z  "`echo $MAILED | grep -w $DEVICE`" ] ; then
				  echo "WARNING: $DEVICE only $ISMB mb free.      (Trigger is set to $MINMB mb)" \
				  | mail -s "WARNING: $DEVICE only $ISMB mb free!" $MAIL_TO_ME
				  MAILEDH="$MAILED $DEVICE"
				  MAILED=$MAILEDH
				  # put further action here like cleaning
				  # up */tmp dirs...
			  fi
			  elif [ -n  "`echo $MAILED | grep -w $DEVICE`" ] ; then
				  # Remove mailed marker if enough disk space
				  # again. So we are ready for new mailing action.
				  MAILEDH="`echo $MAILED  | sed s#$DEVICE##`"
				  MAILED=$MAILEDH
			  fi
			
		  done
		  sleep $SLEEPTIME

  done

2.4. ログファイル掃除ユーティリティ 〜Paul Anderson, Tips-HOWTO 管理者

わたしと読者が同じ環境にあるとするなら、読者は 430 人の登録者リストと、日に 100 通以上のメッセージを UUCP 上で受け取っているはずです。こういう場合、 ハッカーならどうやってこの巨大なログを処理するんでしょうか? そう、 chklogs をインストールすればいいのです。 chklogs は Emilio Grimaldo <grimaldo@panama.iadhv.nl> が作成したもので、 最新バージョンの 1.8 は、ftp.iaehv.nl:/pub/users/grimaldo/chklogs-1.8.tar.gz から入手できます。 なによりもまず、これをインストールしましょう(もちろん、doc サブディレクトリにある info ファイルも チェックすること)。 インストールが完了したら、crontab に次の行を書き込んで ください。

  # Run chklogs at 9:00PM daily.
  00 21 * * *       /usr/local/sbin/chklogs -m

作業のあいまに、このソフトウェアがどれほど素晴らしいか作者に伝えるのを 忘れないでください。

2.5. core ファイル掃除のお手軽スクリプト 〜Otto Hammersmith <ohammers@cu-online.com>

次のスクリプトを記述した rmcores というファイル ( このプログラムの作者は、これを handle-cores と呼んで います) を作成します。

  #!/bin/sh
  USAGE="$0 <directory> <message-file>"

  if [ $# != 2 ] ; then
          echo $USAGE
          exit
  fi

   echo Deleting...
  find $1 -name core -atime 7 -print -type f -exec rm {} \;

  echo e-mailing
  for name in `find $1 -name core -exec ls -l {} \; | cut -c16-24`
  do
          echo $name
          cat $2 | mail $name
  done

そして、cron のジョブとして、これを定期的に起動して ください。

2.6. 異なるファイルシステム間でのディレクトリ移動 〜Alan Cox <A.Cox@swansea.ac.uk>

あるディスクから他のディスクへ、ファイルツリーを丸ごとすばやく移動させる方法。

  (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)

[事故でディレクトリをダメにしてしまわないように、 cd /source/directory; tar... の部分を変更しました。 これを教えてくれた Jim Dennis <jim@starshine.org> 、ありがとう。〜管理人 ]

2.7. どのディレクトリが一番大きいかを知る 〜Mick Ghazey <mick@lowdown>

お使いのコンピュータでどのディレクトリが一番大きいか?って思ったことは ありませんか? 次のコマンドで判ります。

  du -S | sort -n

2.8. Linux Gazette

Linux Gazette の創刊者、John Fisk に栄誉あれ! 素晴らしいオンラインマガジンで あるばかりでなく、無料!!!なのです。これ以上何を期待します? 次のサイトを チェックしてください。

http://www.linuxgazette.com

現在、Linux Gazette は (1) 月刊になり、(2) John Fisk は既に編集を退いて、 SSC が引き継いでいます。

2.9. GNU Make 3.70 の VPATH まわりの振る舞いを変えるパッチの場所 〜Ted Sterm <sterm@amath.washington.edu>

この問題を抱えている人が多いかどうかは分かりませんが、GNU Make のバージョン 3.70 にはわたしの気に入らない「特徴」があります。VPATH を絶対パス名で与えた 場合、おかしな動作をするのです。これに対処するきわめて安定したパッチを Paul D. Smith <psmith@wellfleet.com> が提供しています。また、彼は GNU Make が更新 されるたびに、ニュースグループ gnu.utils.bug にドキュメントとパッチを投稿 しています。わたしは、アクセスするシステムのほぼすべての gmake にこのパッチを 当てて再コンパイルしています。

2.10. リブートのたびにいちいち fsck するのをやめさせるには? 〜Dale Lutz <dal@wimsey.com>

Q:ブートのたびに e2fsck がディスクをチェックします。やめさせるには?

カーネルを再構築すると、そのファイルシステムは "dirty" とマークされ、 その結果、ブートのたびにディスクがチェックされてしまいます。これを やめさせるには、次のコマンドを実行します。

  rdev -R /zImage 1

このコマンドでカーネルが修正されるので、ファイルシステムは "dirty" だと 判断されることがなくなります。

注意: lilo を使っている場合、lilo の設定ファイル (通常は、/etc/lilo.conf) の linux 設定の部分に read-only を加えてくださ い。

2.11. リブートの際、"device busy" のせいで fsck されるのを避ける方法 〜Jon Tombs <jon@gtex02.us.es>

シャットダウン時に "device busy" エラーが頻発する場合は、リブート時にファイル システムが fsck されます。以下に簡単な修正方法を述べます。

/etc/rc.d/init.d/halt/etc/rc.d/rc.0 に移動し、そして

  mount -o remount,ro /mount.dir

の一行を、umout -a を呼ぶ前に、/ を除いた、マウントする予定のすべてのファイル システムに対して付け加えます。こうすれば、何らかの理由で shutdown がプロセスの kill に失敗してディスクの umount ができなかった場合でも、リブートの際、ディスクは "clean" なままです。リブート時間をかなり節約してくれます。

2.12. ハードディスク上の一番大きなファイルを見つける方法 〜Simon Amor <simon@foobar.co.uk>

  ls -l | sort +4n

あるいは、ディスクスペースがまさに逼迫している場合には、ちょっと時間が 掛かりますが、効果てきめんの次のコマンドを使ってください。

  cd /
  ls -lR | sort +4n

2.13. パンチ穴を開けるマージンを取ってプリントアウトする方法 〜Mike Dickey <mdickey@thorplus.lib.purdue.edu>

  #!/bin/sh
  # /usr/local/bin/print
  # a simple formatted printout, to enable someone to
  # 3-hole punch the output and put it in a binder

  cat $1 | pr -t -o 5 -w 85 | lpr

2.14. 特定の正規表現を使ってファイルツリーを検索する方法 〜Raul Deluth Miller <rockwell@nova.umd.edu>

わたしはこのスクリプトを "forall" と呼んでいます。次のようにして使って ください。

  forall /usr/include grep -i ioctl
  forall /usr/man grep ioctl

以下は、"forall" の中身です。

  #!/bin/sh
  if [ 1 = `expr 2 \> $#` ]
  then
          echo Usage: $0 dir cmd [optargs]
          exit 1
  fi
  dir=$1
  shift
  find $dir -type f -print | xargs "$@"

2.15. プログラムが勝手に作ったバックアップファイルやオートセーブファイルを 掃除するスクリプト 〜Barry Tolnas <tolnas@nestor.engr.utk.edu>

以下で紹介するのは、emacs のオートセーブファイル( #)、バックアップファイル(~)、 .o ファイル、TeX.log ファイルについて、ファイル階層を再帰的に下降して 削除する簡単な 2 行モノです。.texREADME ファイルの圧縮もします。わたしはこれを "sqeeze" と呼んでいます。

  #!/bin/sh
  #SQUEEZE removes unnecessary files and compresses .tex and README files
  #By Barry tolnas, tolnas@sun1.engr.utk.edu
  #
  echo squeezing $PWD
  find  $PWD \( -name \*~ -or -name \*.o -or -name \*.log -or -name \*\#\) -exec
  rm -f {} \;
  find $PWD \( -name \*.tex -or -name \*README\* -or -name \*readme\* \) -exec gzip -9 {} \;

2.16. 一番メモリを食っているプロセスを探す方法 〜Simon Amor <simon@foobar.co.uk >

  ps -aux | sort +4n

または、

  ps -aux | sort +5n

2.17. C プログラミング向けに vi をいじる 〜Paul Anderson Tips-HOWTO 管理者

わたしは、暇があると C プログラムを書いてます。その合間に、vi で C を書きやすくするための修正を加えました。以下がわたしの .exrc です。

  set autoindent
  set shiftwidth=4
  set backspace=2
  set ruler

これが何をしているかというと、まず autoindent は、最初に一度 インデントを入れるとそれ以下の行でも自動的にインデントを入れるものです。 shiftwidth は、^T をスペース 4 つ 分に設定するもので、backspace は、backspace モードに 設定するもの、ruler は、行番号を表示するものです。 特定の行番号に移動する場合、たとえば 20 行目に行くには、次のコマンドを 使います。

  vi +20 myfile.c

2.18. ctags を使って、プログラミングをやりやすくする方法

たいていのハッカーは、コンピュータ上に ctags を入れていますが、使ってません。 でも、これは特定の関数を編集する際にとても便利です。たとえば、ある関数があり、 それが作成中のプログラム用ディレクトリ内のたくさんのソースファイルのひとつに 入っていて、ちょうど更新のためにその関数の編集をしたいのだとします。そして、 この関数の名前は、foo() だとして、これをどのソース ファイルに入れたのか忘れてしまったとします。ctags が便利なのはそういう場合 です。ctags を実行すると、tags というファイルが カレントディレクトリに作成され、そのファイルにすべての関数が表示されます。 そして、それらがどのファイルにあるのか、そのファイル内のどこにあるのかを 教えてくれます。tags ファイルの中身は次のようなものです。


  ActiveIconManager	iconmgr.c	/^void ActiveIconManager(active)$/
  AddDefaultBindings	add_window.c	/^AddDefaultBindings ()$/
  AddEndResize	resize.c	/^AddEndResize(tmp_win)$/
  AddFuncButton	menus.c	/^Bool AddFuncButton (num, cont, mods, func, menu, item)$/
  AddFuncKey	menus.c	/^Bool AddFuncKey (name, cont, mods, func, menu, win_name, action)$/
  AddIconManager	iconmgr.c	/^WList *AddIconManager(tmp_win)$/
  AddIconRegion	icons.c	/^AddIconRegion(geom, grav1, grav2, stepx, stepy)$/
  AddStartResize	resize.c	/^AddStartResize(tmp_win, x, y, w, h)$/
  AddToClientsList	workmgr.c	/^void AddToClientsList (workspace, client)$/
  AddToList	list.c	/^AddToList(list_head, name, ptr)$/

vim で、たとえば AddEndResize() を編集する場合は、次のようにします。

  vim -t AddEndResize

これによって、エディタに適切なファイルが読み込まれ、カーソル位置が指定した 関数の最初にきます。

2.19. Red Hat で sendmail が起動時に 5 分間ハングする理由 〜Paul Anderson <paul@geeky1.ebtech.net>

これは、FAQ の対象になるくらい広く知られた問題です。Red Hat のディストリ ビューションでこのバグが修正されたのかどうかは知りませんが、自分で直すこと もできます。/etc/hosts ファイルを覗くと、次のように なっているのが分かると思います。

  127.0.0.1		localhost	yourbox

sendmail は起動時にホスト名(上記の例では、 yourbox) を探します。そして、yourbox の IP が 127.0.0.1 であることを知るわけですが、sendmail はこの IP が嫌いなので、もう一度、探そうとします。 これを何度か繰り返して、最後に諦めて終了してしまいます。この問題を解決するのは とても簡単で、/etc/hosts ファイルを開いて、たとえば次の ように変更するだけです。

  127.0.0.1		localhost
  10.56.142.1		yourbox

2.20. Red Hat で color-ls を使うための設定方法 〜Paul Anderson <paul@geeky1.ebtech.net>

Red Hat ディストリビューションには color-ls が同梱されていますが、 どうして初期設定の色使いのまま放置されているのか理解に苦しみます。 以下は、それを修正するものです。

まず、eval `DIRCOLORS` とタイプします。

次に、alias ls='ls --color=auto' とします。

そして、上記 alias...../etc/bashrc に記述します。

2.21. 特定の関数が /usr/lib のどのライブラリにあるか 探す方法 〜Pawel Veselow <vps@unicorn.niimm.spb.su>

コンパイルの途中でリンクする必要があるライブラリが見当たらない場合、どうしま す? gcc が報告するのは関数名だけです。以下の簡単なコマンド で、その関数を見つけることができます。

  for i in *; do echo $i:;nm $i|grep tgetnum 2>/dev/null;done

上記の tgetnum という部分に、探している関数名が はいります。

2.22. C の簡単な test プログラムをコンパイルしたけれど、実行しても何も出力されない!

おそらく、そのプログラムをコンパイルして、test という 名前のバイナリを作成したのではないでしょうか? Linux には test というプログラムがもともと存在しています。これは、ある条件が 真か否かをテストするプログラムで、真の場合は画面に何も表示しません。単に test と打つのではなく、./test と打ってみてください。