极湖

无不用其“极”

Subscribe to RSS feed

Posts tagged with "Linux"

CentOS 时区设置

, ,

第一步
cp /usr/share/zoneinfo/{时区名} /etc/localtime

第二步
vi /etc/sysconfig/clock
ZONE="{时区名}"
UTC=true
ARC=false


第三步
yum install ntp
ntpdate us.pool.ntp.org


例1)日本东京
cp /usr/share/zoneinfo/Japan /etc/localtime
vi /etc/sysconfig/clock
ZONE="Asia/Tokyo"


例2)中国上海
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
vi /etc/sysconfig/clock
ZONE="Asia/Shanghai"

Linux 日文编码转换命令 nkf 用法

, ,

基本命令格式:
$ nkf 参数 文件名 [> 输出文件名]

通过管道使用(例):
$ cat 文件名 | nkf 参数 [> 输出文件名]

常用参数:
-j           : 转换为 JIS 编码(ISO-2022-JP),默认
-e           : 转换为 EUC 编码
-s           : 转换为 Shift-JIS 编码
-w           : 转换为 UTF-8 编码(无BOM)
-Lu          : 转换为 unix 换行格式(LF)
-Lw          : 转换为 windows 换行格式(CRLF)
-Lm          : 转换为 macintosh 换行格式(CR)
-g(--guess)  : 自动判断编码并显示
--version    : 显示版本
--help       : 显示帮助

grep 的复合条件检索

, ,

单个条件的 grep 检索命令很简单:

grep pattern1 textfile

以上命令也是最常用的形式。

复合条件的检索就不那么简单,因此有必要整理一下。

● AND条件
grep pattern1 textfile | grep pattern2

● OR条件
grep "pattern1\|pattern2" textfile
grep -e pattern1 -e pattern2 textfile

● 除外(AND)
grep -v "pattern1\|pattern2" textfile

● 常用参数
-i 不区分大小写
-l 只列出符合条件的文件名
-n 显示行号
-v 列出不符合条件的行 
--color 给符合条件的关键字加颜色
-o 只显示符合条件的关键字
-r 在指定目录下递归检索

用 PHP 实现文件查找的两种方法

,

废话少说,直接贴代码:
<?php
/**
 * 方法一
 * 用 PHP 的 glob 函数和递归
 *
 * @return array 所有匹配文件的数组
 *
 * @param string $dir     - 目标路径
 * @param string $pattern - 匹配模式
 */
function find($dir, $pattern){
    $dir = escapeshellcmd($dir);
    $files = glob("$dir/$pattern");
    foreach (glob("$dir/{.[^.]*,*}", GLOB_BRACE|GLOB_ONLYDIR) as $sub_dir){
        $arr   = find($sub_dir, $pattern);
        $files = array_merge($files, $arr);
    }
    return $files;
}

/**
 * 方法二
 * 利用 Unix 的 find 命令
 *
 * @return array 所有匹配文件的数组
 *
 * @param string $dir     - 目标路径
 * @param string $pattern - 匹配模式
 */
function find2($dir, $pattern){
    $dir = escapeshellcmd($dir);
    $files = shell_exec("find $dir -name '$pattern' -print");
    $files = explode("\n", trim($files));
    return $files;
}

// 测试代码
$time1 = microtime();
$files = find('/home/ZF/', '*');
$time2 = microtime();
//print_r($files);
echo 'find1 count: '. count($files);
echo "\n";
echo 'find1 time: '. ($time2 - $time1);
echo "\n";

$time1 = microtime();
$files = find('/home/ZF/', '*');
$time2 = microtime();
//print_r($files);
echo 'find2 count: '. count($files);
echo "\n";
echo 'find2 time: '. ($time2 - $time1);
echo "\n";


// 运行结果
$ php find.php
find1 count: 2809
find1 time: 0.064942
find2 count: 2809
find2 time: 0.064129

$ php find.php
find1 count: 2809
find1 time: 0.064989
find2 count: 2809
find2 time: 0.064322

可以看到,两种方法,效率相差不大,用 find 命令实现的方式稍稍快那么一点点。

参考: http://www.redips.net/php/find-files-with-php/

通过 scp 更新代码的 Bash 脚本

,

scp 命令比较长,每次输入比较烦人,因此做一个简单的脚本,参数是子目录名或文件名。
需要注意的是,子目录的复制,目标路径应该是上一级。
如果同时复制了 Subversion 的 .svn 目录和文件,复制完成之后查找并删除之。

代码
#!/bin/sh
SRC_PATH=/home/somepath/$1
DEST_PATH=/home/somepath/$1
if [ -d $DEST_PATH ]; then
  DEST_PATH=$DEST_PATH/../  # 如果是目录,目标是上一级
fi
scp -rp username@remote.host:$SRC_PATH $DEST_PATH 
# 此处输入密码
# 删除 .svn 
find $DEST_PATH -type d -name ".svn" -exec rm -rf {} \;

在虚拟主机上创建 Symbol Link

, ,

便宜的虚拟主机不提供 Shell,因此需要用命令实现的功能不大容易实现。
做网站经常要用 ln 命令创建链接,而要在一般的虚拟主机上就不得不想其他办法了。
不用命令的情况下,用程序倒也能解决一些问题,比如这个建立链接的目标,可用以下 PHP 程序实现:
<?php
$appLib = realpath(dirname(__FILE__) . '/../library');
$zfLib = realpath(dirname(__FILE__) . '/../../ZF');
symlink("$appLib/Zend", "$zfLib/Zend");

经测试,链接正常建立,然而不能正常工作,只能说虚拟主机的自我保护功能做得还不错。

让 root 用户不能直接删除文件的方法

,

有时候为了加强对文件的保护,让 root 用户也不能直接删除某些文件。
chattr 命令给文件设置属性,即可实现以上目标。

例:
# touch test
# chattr +i test
# man chattr
# rm -f test
rm: cannot remove `.htaccess': Operation not permitted
root:~# echo $?
1


若要恢复,只需把命令中的 + 号变成 - 号:
# chattr -i test
# rm test
# echo $?
0


若要查看文件属性,用 lsattr 命令
# lsattr test
----i-------- test


以上方法,对 cp,mkdir, mv, chmod, chown 等命令同样适用。

老系统(Redhat AS3)下编译安装 Subversion 1.5.5

,

1. 下载

wget http://subversion.tigris.org/downloads/subversion-1.5.5.tar.bz2
wget http://subversion.tigris.org/downloads/subversion-deps-1.5.5.tar.bz2

2. 编译安装

tar -zxvf subversion-1.5.5.tar.bz2
tar -zxvf subversion-deps-1.5.5.tar.bz2
cd subversion-1.5.5
./configure
make

报警:没有 Berkley DB

出错:
/usr/include/openssl/kssl.h:72:18: krb5.h: No such file or directory
... ...


3. 安装 OpenSSL 最新版

wget http://www.openssl.org/source/openssl-0.9.8i.tar.gz
tar -zxvf openssl-0.9.8i.tar.gz
cd openssl-0.9.8i
make
make install

4. 安装 Berkley DB

下载 db-4.7.25.tar.gz (不能直接 wget,具体怎么做不再赘述)
tar -zxvf db-4.7.25.tar.gz
cd db-4.7.25
../dist/configure --prefix=/usr/local/berkeley-db --enable-compat185
make
make install

5. 排错

经查证,文件 krb5.h 在 /usr/kerberos/include/ 下面,网上有介绍说在 Makefile 里面加上这个路径就可以,于是在 Makefile 中追加:
-I//usr/kerberos/include
再次编译,仍然出错。

最后只有用文件链接的土办法来解决:
ln -s /usr/kerberos/include/krb5.h /usr/include/krb5.h
ln -s /usr/kerberos/include/profile.h /usr/include/profile.h
ln -s /usr/kerberos/include/com_err.h /usr/include/com_err.h

重新配置和编译
./configure --with-ssl --with-berkeley-db=/usr/local/berkeley-db
make

还是出错,说是找不到 libdb-4.1.la 和 libexpat.la。
上网找解决办法,说是加 --disable-shared 即可解决。

6. 再次编译安装

cd subversion-1.5.5
./configure --with-ssl --with-berkeley-db=/usr/local/berkeley-db --disable-shared
make
make install

忙活半天,终于装上。
为了给后人省时间,记录一下安装过程。

删除 Postfix 邮件队列中的特定邮件

, ,

用一个命令组合即可删除 Postfix 邮件队列中的特定邮件。

例:
# mailq | awk '/bad_address@bad_domain/ {print $1}' | tr -d '*' | xargs -n 1 postsuper -d

其中 bad_address@bad_domain 这个字符串根据实际情况修改。

这个命令用到了 awk,tr, xargs 这些命令,很有代表性,因此记录一下。

用 tar 和 NFS 实现网络文件快速拷贝

, , ,

(本文部分翻译自: fast network file copying using tar and nfs)

先在远程机器(例如:192.168.1.3)配置 NFS 的输出路径,允许从本地拷贝文件(例如:/remotedir)。

在本地机器上创建新的空路径,然后 mount 上远程目录。命令如下:

mkdir /remotedir
mount 192.168.1.3:/remotedir /remotedir


完成以上步骤之后,即可在本地机和远程机之间拷贝文件:

tar -c localdir/ | tar -C /remotedir/ -xv

该命令将本地当前路径 localdir 之下的内容全部拷贝到远程机器的 /remotedir 之下。

注: 拷贝通常用 cp 命令,以上用的是 tar, 是不是更快,需要您自己验证。
February 2012
S M T W T F S
January 2012March 2012
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29