Chinaunix首页 | 论坛 | 博客
  • 博客访问: 254273
  • 博文数量: 78
  • 博客积分: 1465
  • 博客等级: 上尉
  • 技术积分: 972
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-28 13:46
文章分类

全部博文(78)

文章存档

2012年(1)

2011年(9)

2010年(68)

我的朋友

分类:

2010-01-11 00:53:38


(源)友情链接Abettor童鞋:
我的另一篇关于shell的日志:shell编程备忘录


Shell公共函数库

Linux 系统里有一些公共的Shell函数库可供使用,最重要的是/etc/rc.d/init.d/functions,在/etc/init.d目录下有很多脚本都用到了这个函数库,里面提供了很多有用的方法,比如:killproc()等等。所以编写自己的Shell脚本时可以调用这个函数库:

if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi

(备注:/etc/init.d/目录下的函数实现的服务通常有如下用法:
添加一个服务:sudo update-rc.d 服务名 defaults 99
删除一个服务 :sudo update-rc.d 服务名 remove
临时重启一个服务:/etc/init.d/服务名 restart
临时关闭一个服务:/etc/init.d/服务名 stop
临时启动一个服务:/etc/init.d/服务名 start
)

Shell里循环的几种方式

for i in `seq 1 10`; do echo $i; done
for ((i=1; i<=10; i++)); do echo $i; done

设置linux系统里打开文件描述符的最大值

通过ulimit -n命令可以查看linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值。那么应该在哪里设置呢?

比如说想把linux系统里打开文件描述符的最大值设置为65535, 命令是ulimit -n 65535。需要说明的是这是一个和会话相关的命令,比如说你打开两个命令行终端,分别设置一个不同的值,再查询,会发现彼此不受影响。那么到底应该在哪里设置linux系统里打开文件描述符的最大值呢?一个最常见的错误就是在/etc/rc.local里设置,因为rc.local是在最后才被加载的,所以前面加载的程序,如/etc/init.d里的程序都没有机会使用到这个设置值,只有rc.local文件里ulimit -n 65535声明后面的命令才能使用到这个设置值,因为它们在同一个会话里。

最正确的做法是在/etc/security/limits.conf里设置:

* hard nofile 65535
* soft nofile 65535

这样设置后所有的程序,所有的会话就都能使用到这个设置值了。

找出大文件

磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁:

du -s /home/* | sort -nr

根据负载自动重启Apache

#!/bin/sh

APACHE=/usr/local/bin/apachectl
LOG=/var/log/apache.log

if [ `awk -F. '{print $1}' /proc/loadavg` -gt 100 ]; then
echo "Stop Apache at `date`" >> $LOG

$APACHE stop

while [ `ps -ef | grep httpd | grep start | wc -l` -gt 0 ]; do
killall httpd
sleep 1
done

echo "Start Apache at `date`" >> $LOG

$APACHE start
fi

查看服务器制造商

dmidecode -s system-product-name

我在Dell的PowerEdge 1950服务器上使用上述命令能看到结果,但是在HP的ProLiant DL380 G5服务器上使用system-product-name却无效,什么也找不到,此时只能用dmidecode | more自己慢慢查了。

限制可以使用su命令的用户

vi /etc/pam.d/su

# Uncomment the following line to require a user to be in the "wheel" group.
# auth required pam_wheel.so use_uid

取消相应的注释仅让wheel组用户能使用su命令

/usr/sbin/visudo(vi /etc/sudoers)

# Uncomment to allow people in group wheel to run all commands
# %wheel ALL=(ALL) ALL

# Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL

一个是输入密码的,一个是不用输入密码的,选一个取消注释。

剩下的就是把用户加到wheel组,可以先在/etc/group文件里查询wheel的GID,然后修改密码文件:

/usr/sbin/vipw(vi /etc/passwd)

或者直接使用命令:

/usr/sbin/vigr(vi /etc/group)

把用户名加到wheel行的末尾,如果是多个用户名的话用逗号分隔,group文件的详细介绍看man group

但更好的方法是使用gpasswd命令:

gpasswd -a 用户名 wheel

设置好之后可以用groups命令查看一下:

groups 用户名

Debian下自动生成最快的sources.list

老版Debian可以使用base-config来设置sources.list,但是在新版中这个软件包已经被取消了,取而代之的是netselect-apt,先安装这个软件包:

aptitude install netselect-apt
cd /etc/apt
netselect-apt stable

这样就能自动生成最快的sources.list文件了。

BWT:题外话,aptitude install build-essential,装完系统顺手就装上这个,免得以后麻烦。

万能的“-”参数

横线“-”参数在Linux里有很多奇妙的应用。

RewriteRule . - [F]

在rewrite里,横线"-"表示什么也不做,整句的含义直接按标志位[F]的意思来,也就是禁止。

cd -命令:An argument of - is equivalent to $OLDPWD(man cd)
su -命令:Make the shell a login shell(man su)

在tar命令里,横线“-”还代表着输入,输出:

tar zcvf - /path/to/foo | (cd /path/to/bar; tar zxvf -)
tar zcvf - /path/to/foo | ssh ip "cd /path/to/bar; cat > filename.tgz"

使用/dev/zero,/dev/null两个设备分别测试磁盘的读写性能

假设256M的数据,分别按4k, 8k的BlockSize大小进行读写测试:

time dd if=/tmp/testfile of=/dev/null bs=4k(4k读)
time dd if=/tmp/testfile of=/dev/null bs=8k(8k读)

time dd if=/dev/zero of=/tmp/testfile bs=4k count=65536(4k写)
time dd if=/dev/zero of=/tmp/testfile bs=8k count=32768(8k写)

可以man zero或者man null看具体介绍。

查看哪些程序在使用设备(以挂载到/media/USB的/dev/sdb1为例):

lsof /dev/sdb1

#or

fuser -m -v /media/USB

不过lsof更加偏向底层一些,可以显示各种文件描述符的打开情况,fuser更倾向于文件系统中的文件和网络套接字的使用情况,fuser -m -v /任意文件夹

而以下命令可以很顺利地解决 “Device is busy” 的问题。

# fuser -m -v -i -k /media/USB/
用户 进程号 权限 命令
/media/USB/: z 371 ..c.. vi
杀死进程 371 ? (y/n)
阅读(928) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~