下一篇 上一篇 目录

2. 简短技巧

2.1 方便的 Syslog 技巧 Paul Anderson,Tips-HOWTO 维护者

编辑你的 /etc/syslog.conf,并加入以下行

# Dump everything on tty8
*.*                                     /dev/tty8
一个注意事项:记住要使用制表符! syslog 不喜欢空格……

2.2 用于查看压缩 HOWTO 的脚本。Didier Juges, dj@destin.nfds.net

对于从新手到另一个新手的人来说,这是一个简单的脚本,可以轻松查找和查看 howto 文档。我的 howto 文档在 /usr/doc/faq/howto/ 中,并且是 gzipped 压缩的。文件名是 XXX-HOWTO.gz,XXX 是主题。我在 /usr/local/sbin 目录中创建了以下名为“howto”的脚本


#!/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

这是一个简短的脚本,它会不时检查在 mount 中显示的任何内容(磁盘、cdrom、软盘...)上是否有足够的可用空间。

如果空间耗尽,则每 X 秒向屏幕打印一条消息,并为每个已满设备发送 1 封邮件消息。


#!/bin/sh

#
# $Id: check_hdspace,v 1.18 1996/12/11 22:33:29 root Exp root $
#

#
# Since I got mysterious error messages during compile when
# tmp files filled up my disks, I wrote this to get a warning
# before disks are full.
#
# If this stuff saved your servers from exploding,
# send praising email to zocki@goldfish.cube.net.
# If your site burns down because of this, sorry but I
# warned you: no comps.
# If you really know how to handle sed, please forgive me :)
#

#
# Shoot and forget: Put 'check_hdspace &' in rc.local.
# Checks for free space on devices every $SLEEPTIME sec.
# You even might check your floppies or tape drives. :)
# If free space is below $MINFREE (kb), it will echo a warning
# and send one mail for each triggering device to $MAIL_TO_ME.
# If there is more free space than trigger limit again,
# mail action is also armed again.
#

# TODO: Different $MINFREE for each device.
# Free /*tmp dirs securely from old junk stuff if no more free space.


DEVICES='/dev/sda2 /dev/sda8 /dev/sda9'         # device; your put disks here
MINFREE=20480                                   # kb; below this do warning
SLEEPTIME=10                                    # sec; sleep between checks
MAIL_TO_ME='root@localhost'                     # fool; to whom mail warning


# ------- no changes needed below this line (hopefully :) -------

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 个订阅者的列表,并且每天通过 UUCP 接收 100 多条消息。那么,黑客如何处理这些巨大的日志呢?安装 chklogs,就是这样。Chklogs 由 Emilio Grimaldo 编写,grimaldo@panama.iaehv.nl,当前版本 1.8 可从 ftp.iaehv.nl:/pub/users/grimaldo/chklogs-1.8.tar.gz 获取。安装非常简单(你当然会查看 doc 子目录中的信息)。安装完成后,添加一个类似这样的 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....etc. 更改,以防止在发生灾难时损坏目录的可能性。感谢 Jim Dennis,jim@starshine.org,告知我这一点。 -维护者。]

2.7 找出哪些目录是最大的。Mick Ghazey, mick@lowdown.com

有没有想过哪些目录在你的计算机上是最大的?以下是如何找出答案。

du -S | sort -n

2.8 Linux Gazette

荣誉归于 Linux Gazette 的创建者 John Fisk。这是一个很棒的电子杂志,而且是免费的!!!你还能要求什么呢?查看网址

http://www.linuxgazette.com
顺便说一句,事实证明 (1) LG 现在是每月出版一次,并且 (2) John Fisk 不再维护它,SSC 的伙计们在维护。

2.9 GNU Make 3.70 的补丁指针,用于更改 VPATH 行为。 Ted Stern, stern@amath.washington.edu

我不知道是否很多人有这个问题,但是 GNU make 版本 3.70 有一个我不喜欢的“功能”。如果给 VPATH 一个绝对路径名,它会表现得很奇怪。有一个非常可靠的补丁可以修复这个问题,你可以从 Paul D. Smith <psmith@wellfleet.com> 获得。他还会在新闻组“gnu.utils.bug”上发布 GNU make 每次修订后的文档和补丁。通常,我会应用这个补丁并在我访问的每个系统上重新编译 gmake。

2.10 如何阻止我的系统在每次重启时进行 fsck?Dale Lutz, dal@wimsey.com

问:如何阻止 e2fsck 在每次启动时检查我的磁盘。

答:当你重新构建内核时,文件系统被标记为“脏”,因此你的磁盘将在每次启动时进行检查。解决方法是运行

rdev -R /zImage 1

这修复了内核,使其不再认为文件系统是脏的。

注意:如果使用 lilo,那么在你的 lilo 配置文件(通常是 /etc/lilo.conf)的 linux 设置中添加 read-only

2.11 如何避免在重启时因“设备忙”引起的 fsck。Jon Tombs, jon@gtex02.us.es

如果你经常在关机时遇到设备忙错误,导致文件系统在重启时需要 fsck,这里有一个简单的修复方法

对于除 / 之外的所有已挂载文件系统,在调用 umount -a 之前,将以下行添加到 /etc/rc.d/init.d/halt/etc/rc.d/rc.0

mount -o remount,ro /mount.dir
这意味着,如果由于某种原因,关机未能杀死所有进程并卸载磁盘,它们在重启时仍然是干净的。为我节省了很多重启时间。

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 文件。它还压缩 .tex 文件和 README 文件。我在我的系统上称它为“squeeze”。


#!/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 使 vi 自动缩进第一行缩进后的每一行,shiftwidth 将 ^T 的距离设置为 4 个空格,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 为什么 sendmail 在 RedHat 上启动时挂起 5 分钟?Paul Anderson, paul@geeky1.ebtech.net

这是一个相当常见的问题,几乎到了成为 FAQ 的地步。我不知道 RedHat 是否在其发行版中修复了这个错误,但你可以自己修复它。如果你查看你的 /etc/hosts 文件,你会发现它看起来像这样

127.0.0.1               localhost       yourbox

当 sendmail 启动时,它会对你的主机名(在本例中为 yourbox)进行查找。然后它发现 yourbox 的 IP 是 127.0.0.1,sendmail 不喜欢这样,所以它再次进行查找。它会继续这样做一段时间,直到最终放弃并退出。修复这个问题非常容易,编辑你的 /etc/hosts 文件并将其更改为类似这样的内容

127.0.0.1               localhost
10.56.142.1             yourbox

2.20 如何配置 RedHat 以使用 color-ls?Paul Anderson, paul@geeky1.ebtech.net

RedHat 的发行版附带 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 的二进制文件,不是吗?Linux 有一个名为 test 的程序,它测试某个条件是否为真,它永远不会在屏幕上产生任何输出。不要只输入 test,尝试:./test


下一篇 上一篇 目录