作者:老王
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
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文件了。
題外話,aptitude install build-essential,裝完系統順手就裝上這個,免得以后麻煩。
CentOS下有一個功能差不多的軟件包,可以這樣安裝:yum install yum-fastestmirror( 參考鏈接)
萬能的“-”參數
橫線“-”參數在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"
gzip -cd foobar.tar.gz | tar xf -
使用/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看具體介紹。
查看Apache編譯的模塊
httpd -l (for static modules)
httpd -M (for shared/dynamic modules)
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
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文件了。
題外話,aptitude install build-essential,裝完系統順手就裝上這個,免得以后麻煩。
CentOS下有一個功能差不多的軟件包,可以這樣安裝:yum install yum-fastestmirror( 參考鏈接)
萬能的“-”參數
橫線“-”參數在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"
gzip -cd foobar.tar.gz | tar xf -
使用/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看具體介紹。
查看Apache編譯的模塊
httpd -l (for static modules)
httpd -M (for shared/dynamic modules)