/etc/syslog.conf を編集して、次の行を入れます。
# Dump everything on tty8 *.* /dev/tty8 |
注意事項:必ず Tab を使うこと! syslog はスペースを 嫌います.....
初心者のわたしから同じく初心者のひと向けに、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 |
マウントされているデバイス(ディスク、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 |
わたしと読者が同じ環境にあるとするなら、読者は 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 |
作業のあいまに、このソフトウェアがどれほど素晴らしいか作者に伝えるのを 忘れないでください。
次のスクリプトを記述した 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 のジョブとして、これを定期的に起動して ください。
あるディスクから他のディスクへ、ファイルツリーを丸ごとすばやく移動させる方法。
(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -) |
[事故でディレクトリをダメにしてしまわないように、 cd /source/directory; tar... の部分を変更しました。 これを教えてくれた Jim Dennis <jim@starshine.org> 、ありがとう。〜管理人 ]
お使いのコンピュータでどのディレクトリが一番大きいか?って思ったことは ありませんか? 次のコマンドで判ります。
du -S | sort -n |
Linux Gazette の創刊者、John Fisk に栄誉あれ! 素晴らしいオンラインマガジンで あるばかりでなく、無料!!!なのです。これ以上何を期待します? 次のサイトを チェックしてください。
現在、Linux Gazette は (1) 月刊になり、(2) John Fisk は既に編集を退いて、 SSC が引き継いでいます。
この問題を抱えている人が多いかどうかは分かりませんが、GNU Make のバージョン 3.70 にはわたしの気に入らない「特徴」があります。VPATH を絶対パス名で与えた 場合、おかしな動作をするのです。これに対処するきわめて安定したパッチを Paul D. Smith <psmith@wellfleet.com> が提供しています。また、彼は GNU Make が更新 されるたびに、ニュースグループ gnu.utils.bug にドキュメントとパッチを投稿 しています。わたしは、アクセスするシステムのほぼすべての gmake にこのパッチを 当てて再コンパイルしています。
Q:ブートのたびに e2fsck がディスクをチェックします。やめさせるには?
カーネルを再構築すると、そのファイルシステムは "dirty" とマークされ、 その結果、ブートのたびにディスクがチェックされてしまいます。これを やめさせるには、次のコマンドを実行します。
rdev -R /zImage 1 |
このコマンドでカーネルが修正されるので、ファイルシステムは "dirty" だと 判断されることがなくなります。
注意: lilo を使っている場合、lilo の設定ファイル (通常は、/etc/lilo.conf) の linux 設定の部分に read-only を加えてくださ い。
シャットダウン時に "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" なままです。リブート時間をかなり節約してくれます。
ls -l | sort +4n |
あるいは、ディスクスペースがまさに逼迫している場合には、ちょっと時間が 掛かりますが、効果てきめんの次のコマンドを使ってください。
cd / ls -lR | sort +4n |
#!/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 |
わたしはこのスクリプトを "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 "$@" |
以下で紹介するのは、emacs のオートセーブファイル( #)、バックアップファイル(~)、 .o ファイル、TeX の .log ファイルについて、ファイル階層を再帰的に下降して 削除する簡単な 2 行モノです。.tex と README ファイルの圧縮もします。わたしはこれを "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 {} \; |
ps -aux | sort +4n |
または、
ps -aux | sort +5n |
わたしは、暇があると 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 |
たいていのハッカーは、コンピュータ上に 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 |
これによって、エディタに適切なファイルが読み込まれ、カーソル位置が指定した 関数の最初にきます。
これは、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 |
Red Hat ディストリビューションには color-ls が同梱されていますが、 どうして初期設定の色使いのまま放置されているのか理解に苦しみます。 以下は、それを修正するものです。
まず、eval `DIRCOLORS` とタイプします。
次に、alias ls='ls --color=auto' とします。
そして、上記 alias..... を /etc/bashrc に記述します。
コンパイルの途中でリンクする必要があるライブラリが見当たらない場合、どうしま す? gcc が報告するのは関数名だけです。以下の簡単なコマンド で、その関数を見つけることができます。
for i in *; do echo $i:;nm $i|grep tgetnum 2>/dev/null;done |
上記の tgetnum という部分に、探している関数名が はいります。
おそらく、そのプログラムをコンパイルして、test という 名前のバイナリを作成したのではないでしょうか? Linux には test というプログラムがもともと存在しています。これは、ある条件が 真か否かをテストするプログラムで、真の場合は画面に何も表示しません。単に test と打つのではなく、./test と打ってみてください。