2008年12月4日星期四
使用php apc模块需要注意的几点
php
APC模块的发言。作为APC的作者,他的见解应该是很有参考价值的。
APC will probably be 20-30% faster, but if you are writing to it frequently it can cause problems. The APC cache is best for things that change very rarely. And by very rarely I mean days, not hours or minutes.
Because of the way APC does an anonymous file-backed mmap where I unlink the file at startup to get process-death protection, it isn’t easy to get at the cache from a separate standalone command line script. That can be solved by mmap’ing slightly differently, but in the default config your approach won’t work.
-Rasmus
就是说APC不适合用于频繁写的场合,你最好只用它来保存那种几天都不会更改的内容。否则出了莫名其妙的问题就不好怎么解释了。
在以前的应用中,我确实有将apc用在频繁写的场合,偶尔会出现内存耗尽,进而引起所有http请求卡死,形式一发不可收拾整个服务器当掉。所以现在我仅仅用apc来缓存opcode的php代码,不在程序中显式的调用它,算是相安无事。
APC是什么
Alternative PHP Cache (APC)是一种对PHP有效的开放源高速缓冲储存器工具,它能够缓存opcode的php中间码。
phpize简介与实例应用
例如你的php不支持mysql, mbstring等
实例应用:
环境php5.2.6, 不支持mysql扩展
假如php的源码包在/usr/local/src/php-5.2.6
php安装目录是/usr/local/php
# cd /usr/local/src/php-5.2.6
# cd ./ext/mysql
# /usr/local/php/bin/phpize
# ./configure –with-php-config=/usr/local/php/bin/php-config
# make
# make install
这个时候你会看到mysql.so被拷贝到某个目录, 把mysql.so拷贝到你的extension_dir指向的路径, 在php.ini里增加extension=mysql.so
重启web服务器, 看一下phpinfo, 应该支持mysql了, 完毕!
注意: 在执行/usr/local/php/bin/phpize的时候可能会提示某些错误, 例如:Cannot find autoconf, 那就根据错误提示把相关的软件安装, RHEL系列使用yum -y install autoconf就可以了
其他错误, 请留言给我!
所以安装 php-devel 相关套件就会有 phpize 可以使用 (档案预设存放于 /usr/bin/phpize )
phpize 命令是用来准备 PHP 外挂模块的编译环境的。下面例子中,外挂模块的源程序位于 extname 目录中:
# cd extname
# phpize
# ./configure (注一)
# make
# make install
成功的安装将建立 extname.so 并放置于 PHP 的外挂模块目录中 (预设存放于 /usr/lib/php/modules/ 内) 。
需要调整 php.ini,加入 extension=extname.so 这一行之后才能使用此外挂模块。
注一:
如在执行 ./configure 时出现 not find –with-php-config 时,
可重下以下指令,因 –with-php-config 预设在 /usr/bin/php-config 可找到
./configure –with-php-config=/usr/bin/php-config
需要调整 php.ini,加入 extension=extname.so 这一行之后才能使用此扩展库。
memcache安装详细方法
1.安装libevent-1.1a.tar
# tar zxvf libevent-1.1a
# cd libevent-1.1a
#./configure --prefix=/usr/ali/libevent/
# make
# make install
# make clean
2. 安装memcached-1.2.4.tar.gz
# tar zxvf memcached-1.2.4.tar.gz
# cd memcached-1.2.4
#./configure --prefix=/usr/ali/memcached/ --with-libevent=/usr/ali/libevent/
# make
# make install
# make clean
注意:若 libevent 不是安装在默认位置必须在 /usr/lib 下建立一个软连接,否则 memcached 会无法运行
#ln -s /usr/ali/libevent/lib/libevent-1.1a.so.1 /usr/lib
#ln -s /usr/ali/libevent/lib/libevent.so /usr/lib
3.启动memcached
# memcached -d -p port -u admin
比如:
# memcached -d -p 11211 -u admin
4.关闭memcached
二. Window下安装安装说明
下载memcache的windows稳定版,解压缩放某个盘下面,比如在c:\memcached
在终端(也即cmd命令界面)下输入 c:\memcached\memcached.exe -d install 安装
再输入: c:\memcached\memcached.exe -d start 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
Memcached 默认监听端口: 11211
三. 对应命令参数说明
memcached的基本设置:
-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
2008年12月3日星期三
windows安装APC
第二步:让php.ini支持apc扩展模块。
将php_apc.dll放入你的ext目录,然后打开php.ini 加入:
extension=php_apc.dll
apc.rfc1867 = on
apc.max_file_size = 100M
upload_max_filesize = 100M
post_max_size = 100M
//以上参数可自己定义
第三步:检查是否支持PHP APC
APC相关安装
1、tar zxvf apc_x.y.tar.gz
2、cd apc_x.y
3、/PATH/TO/phpize/phpize
4、./configure --enable-apc --with-php-config、/PATH/TO/php-config/php-config
5、make
6、make install
7、编辑php.ini,加入下面命令
extension=apc.so
apc.enabled=1
apc.shm_segments=1
apc.optimization=0
apc.shm_size=128
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1
(注意extension_dir的值别搞错了。apc.so默认安装在php安装路径的lib/php/extensions/下面)
2008年11月27日星期四
php Mysql日期和时间函数集合
根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字(January……December)
-------------------------------------------------------------------------------------
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。
-------------------------------------------------------------------------------------
所有的其他字符不做解释被复制到结果中。
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> select DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
MySQL3.23中,在格式修饰符字符前需要%。在MySQL更早的版本中,%是可选的。
TIME_FORMAT(time,format)
这象上面的DATE_FORMAT()函数一样使用,但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。
其他修饰符产生一个NULL值或0。
CURDATE()
-------------------------------------------------------------------------------------
CURRENT_DATE
以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文被使用。
mysql> select CURDATE();
-> '1997-12-15'
mysql> select CURDATE() + 0;
-> 19971215
CURTIME()
-------------------------------------------------------------------------------------
CURRENT_TIME
以'HH:MM:SS'或HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文被使用。
mysql> select CURTIME();
-> '23:50:26'
mysql> select CURTIME() + 0;
-> 235026
NOW()
SYSDATE()
-------------------------------------------------------------------------------------
CURRENT_TIMESTAMP
以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的
上下文被使用。
mysql> select NOW();
-> '1997-12-15 23:50:26'
mysql> select NOW() + 0;
-> 19971215235026
UNIX_TIMESTAMP()
-------------------------------------------------------------------------------------
UNIX_TIMESTAMP(date)
如果没有参数调用,返回一个Unix时间戳记(从'1970-01-01 00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一个date参数被调用,它返回从'1970-01-01 00:00:00' GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。
mysql> select UNIX_TIMESTAMP();
-> 882226357
mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
当UNIX_TIMESTAMP被用于一个TIMESTAMP列,函数将直接接受值,没有隐含的“string-to-unix-timestamp”变换 http://www.knowsky.com/。
FROM_UNIXTIME(unix_timestamp)
以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值,取决于函数是在一个字符串还是或数字上下文中被使用。
mysql> select FROM_UNIXTIME(875996580);
-> '1997-10-04 22:23:00'
mysql> select FROM_UNIXTIME(875996580) + 0;
-> 19971004222300
FROM_UNIXTIME(unix_timestamp,format)
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
'%Y %D %M %h:%i:%s %x');
-> '1997 23rd December 03:43:30 x'
SEC_TO_TIME(seconds)
返回seconds参数,变换成小时、分钟和秒,值以'HH:MM:SS'或HHMMSS格式化,取决于函数是在一个字符串还是在数字上下文中被使用。
mysql> select SEC_TO_TIME(2378);
-> '00:39:38'
mysql> select SEC_TO_TIME(2378) + 0;
-> 3938
TIME_TO_SEC(time)
返回time参数,转换成秒。
mysql> select TIME_TO_SEC('22:23:00');
-> 80580
mysql> select TIME_TO_SEC('00:39:38');
-> 2378
2008年11月25日星期二
PHP的正则处理函数总结分析
(PHP 4, PHP 5)
preg_grep -- 返回与模式匹配的数组单元
说明
array preg_grep ( string pattern, array input [, int flags] )
preg_grep() 返回一个数组,其中包括了 input 数组中与给定的 pattern 模式相匹配的单元。
flags 可以是以下标记:
PREG_GREP_INVERT
如果传递入此标记,preg_grep() 会返回输入数组中不匹配给定 pattern 的单元。本标记自 PHP 4.2.0 起可用。
自 PHP 4.0.4 起,preg_grep() 返回的结果使用从输入数组来的键名进行索引。如果不希望这样的结果,用 array_values() 对 preg_grep() 返回的结果重新索引。
上面是手册上对preg_grep()的说明。首先这是perl兼容的正则函数,所以我猜想preg_grep的意思是p(perl)reg(regular)_grep,其特点是可做用于数组,通过自己扩展,可用做多维数组中的正则匹配,并且可以通过flags参数返回匹配或者非匹配数组。其效率比用foreach(...){if...}结构快很多(未验证),而且可匹配复杂模式。在搜索、分检等应用中用途不小。
例:12.213,'bb'=>12345,'ba'=>23.2321,34.3,'23'=>'3.3','23434'=>'bbb');
// 返回所有含有浮点数的数组元素。
$fl_array = preg_grep ("/^(\d+)?\.\d+$/", $arr);
print_r($fl_array);
?>
---------------------------------------------------------------------------------------------
preg_match
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_match -- 进行正则表达式匹配
说明
int preg_match ( string pattern, string subject [, array matches [, int flags]] )
在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。
如果提供了 matches,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。
flags 可以是下列标记:
PREG_OFFSET_CAPTURE
如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其偏移量。本标记自 PHP 4.3.0 起可用。
flags 参数自 PHP 4.3.0 起可用。
preg_match() 返回 pattern 所匹配的次数。要么是 0 次(没有匹配)或 1 次,因为 preg_match() 在第一次匹配之后将停止搜索。preg_match_all() 则相反,会一直搜索到 subject 的结尾处。如果出错 preg_match() 返回 FALSE。
提示: 如果只想查看一个字符串是否包含在另一个字符串中,不要用 preg_match()。可以用 strpos() 或 strstr() 替代,要快得多。
上面是手册里对preg_match()的说明,我认为这个函数的功用在于他可做来做验证,也就是某字符串是否符合某特定要求。其局限是上面所说的要么匹配 0次,要么1次。并且返回值是匹配次数。当需要全匹配时可使用preg_match_all().另外值得一提的是$matches数组的作用,可做自模式的返回值,有时很有用。
例:
---------------------------------------------------------------------------------------------
preg_match_all
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_match_all -- 进行全局正则表达式匹配
手册上该函数的解释非常明确,就不多做说明了。
说明
int preg_match_all ( string pattern, string subject, array matches [, int flags] )
在 subject 中搜索所有与 pattern 给出的正则表达式匹配的内容并将结果以 flags 指定的顺序放到 matches 中。
搜索到第一个匹配项之后,接下来的搜索从上一个匹配项末尾开始。
flags 可以是下列标记的组合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起来用没有意义):
PREG_PATTERN_ORDER
对结果排序使 $matches[0] 为全部模式匹配的数组,$matches[1] 为第一个括号中的子模式所匹配的字符串组成的数组,以此类推。
]+>(.*)]+>|U", "example:
$out, PREG_PATTERN_ORDER);
print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n";
?>
本例将输出:
example: ,
example: , this is a test
因此,$out[0] 包含匹配整个模式的字符串,$out[1] 包含一对 HTML 标记之间的字符串。
PREG_SET_ORDER
对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。
]+>(.*)]+>|U",
"example:
$out, PREG_SET_ORDER);
print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n";
?>
本例将输出:
example: , example:
本例中,$matches[0] 是第一组匹配结果,$matches[0][0] 包含匹配整个模式的文本,$matches[0][1] 包含匹配第一个子模式的文本,以此类推。同样,$matches[1] 是第二组匹配结果,等等。
PREG_OFFSET_CAPTURE
如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
如果没有给出标记,则假定为 PREG_PATTERN_ORDER。
返回整个模式匹配的次数(可能为零),如果出错返回 FALSE。
例子 1. 从某文本中取得所有的电话号码
例子 2. 搜索匹配的 HTML 标记(greedy)
bold textclick me";
preg_match_all ("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $matches);
for ($i=0; $i<>
---------------------------------------------------------------------------------------------
preg_quote
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_quote -- 转义正则表达式字符
说明
string preg_quote ( string str [, string delimiter] )
preg_quote() 以 str 为参数并给其中每个属于正则表达式语法的字符前面加上一个反斜线。如果你需要以动态生成的字符串作为模式去匹配则可以用此函数转义其中可能包含的特殊字符。
如果提供了可选参数 delimiter,该字符也将被转义。可以用来转义 PCRE 函数所需要的定界符,最常用的定界符是斜线 /。
正则表达式的特殊字符包括:. \ + * ? [ ^ ] $ ( ) { } = ! < > | :。
注: 本函数可安全用于二进制对象。
上面是手册上的解释,也很明白,不多说了,另外手册上还有一注释就是该函数可安全用于二进制对象,这点很有用。
例: 例子 1. preg_quote() 例子
例子 2. 给某文本中的一个单词加上斜体标记
".$word."",
$textbody);
?>
接下来就是应用超灵活、、功能超强大、使用超广泛的preg_replace函数。
preg_replace
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_replace -- 执行正则表达式的搜索和替换
说明
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。
replacement 可以包含 \\n 形式或(自 PHP 4.0.4 起)$n 形式的逆向引用,首选使用后者。每个此种引用将被替换为与第 n 个被捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,其中 \\0 或 $0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。
对替换模式在一个逆向引用后面紧接着一个数字时(即:紧接在一个匹配的模式后面的数字),不能使用熟悉的 \\1 符号来表示逆向引用。举例说 \\11,将会使 preg_replace() 搞不清楚是想要一个 \\1 的逆向引用后面跟着一个数字 1 还是一个 \\11 的逆向引用。本例中的解决方法是使用 \${1}1。这会形成一个隔离的 $1 逆向引用,而使另一个 1 只是单纯的文字。
如果搜索到匹配项,则会返回被替换后的 subject,否则返回原来不变的 subject。
preg_replace() 的每个参数(除了 limit)都可以是一个数组。如果 pattern 和 replacement 都是数组,将以其键名在数组中出现的顺序来进行处理。这不一定和索引的数字顺序相同。如果使用索引来标识哪个 pattern 将被哪个 replacement 来替换,应该在调用 preg_replace() 之前用 ksort() 对数组进行排序。
如果 subject 是个数组,则会对 subject 中的每个项目执行搜索和替换,并返回一个数组。
如果 pattern 和 replacement 都是数组,则 preg_replace() 会依次从中分别取出值来对 subject 进行搜索和替换。如果 replacement 中的值比 pattern 中的少,则用空字符串作为余下的替换值。如果 pattern 是数组而 replacement 是字符串,则对 pattern 中的每个值都用此字符串作为替换值。反过来则没有意义了。
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
注: limit 参数是 PHP 4.0.1pl2 之后加入的。
我认为其强大之处就是他不但可以处理字符串,而且可以处理数组,并且他的逆向引用功能非常灵活。基本上他可以满足普通用户的大部分需求,如果他不能胜任,那么我们还有 preg_replace_callback()函数,可以自定义回调函数,满足你的高级要求。如设计过滤器等。
preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5)
preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换
说明
mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
本函数的行为几乎和 preg_replace() 一样,除了不是提供一个 replacement 参数,而是指定一个 callback 函数。该函数将以目标字符串中的匹配数组作为输入参数,并返回用于替换的字符串。
例子 1. preg_replace_callback() 例子
You'll often need the callback function for a preg_replace_callback() in just one place. In this case you can use create_function() to declare an anonymous function as callback within the call to preg_replace_callback(). By doing it this way you have all information for the call in one place and do not clutter the function namespace with a callback functions name not used anywhere else.
对于使用 preg_replace_callback()函数的朋友来说,你应该回需要callback函数(否则用他干嘛,直接用preg_replace不是更好),不过也经常只是用一处。既然这样你可以用create_function()来声明一个匿名函数作为 preg_replace_callback()的回调函数。这样,我们即满足了声明信息的需要,有不致因这个不会再用到的函数名而混乱。
例子 2. preg_replace_callback() 和 create_function()
\s*\w|',
create_function(
// 这里使用单引号很关键,
// 否则就把所有的 $ 换成 \$
'$matches',
'return strtolower($matches[0]);'
),
$line
);
echo $line;
}
fclose($fp);
?>
---------------------------------------------------------------------------------------------
preg_split
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_split -- 用正则表达式分割字符串
不再赘述。
说明
array preg_split ( string pattern, string subject [, int limit [, int flags]] )
返回一个数组,包含 subject 中沿着与 pattern 匹配的边界所分割的子串。
如果指定了 limit,则最多返回 limit 个子串,如果 limit 是 -1,则意味着没有限制,可以用来继续指定可选参数 flags。
flags 可以是下列标记的任意组合(用按位或运算符 | 组合):
PREG_SPLIT_NO_EMPTY
如果设定了本标记,则 preg_split() 只返回非空的成分。
PREG_SPLIT_DELIM_CAPTURE
如果设定了本标记,定界符模式中的括号表达式也会被捕获并返回。本标记添加于 PHP 4.0.5。
PREG_SPLIT_OFFSET_CAPTURE
如果设定了本标记,如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。
提示: 如果不需要正则表达式的功能,可以选择使用更快(也更简单)的替代函数如 explode() 或 str_split()。
VI常用操作总结
向右移动 --> l
向左移动 --> h
向下移动 --> j
向上移动 --> k
如上所示,例如要向右移动光标8个字符的距离,只要在键盘上敲 l 键8次即可;向下移动3行的距离,只要在键盘上敲 j 键3次即可……也就是说,在vi命令模式中通过这几个键(命令)来控制光标的移动。
--------------------------------------------------------------------------------
其次就是文本删除的命令。在Windows下大多数编辑器在删除文本时只要连续按[Backspace]键即可。但由于在vi中,插入模式和命令模式是分离开来的,所以在命令模式下需要通过命令(按键)来删除文本,而不是直接按[Backspace]键。
文本删除的命令如下所示:
删除光标所在位置的字符 --> x
删除光标所在的行 --> dd(敲 d 两次)
如上所示,例如要删除从光标位置起向右的3个字符,只要在键盘上敲 x 键3次即可;要删除光标所在的行,只要敲 dd (连续敲d键两次),光标所在行的所有字符以及行将会被删除。
--------------------------------------------------------------------------------
再次,当编辑完了一个文档,想要保存后退出的时候的命令为“ZZ”(大写、连续敲2次)。
保存并退出文档:
保存当前修改并退出 --> ZZ
--------------------------------------------------------------------------------
另外,vi还有一些编辑性质的命令,一并总结如下
具有编辑性质的有用的命令:
撤销上一步操作 --> u
移动光标到行首 --> 0 (数字0)
移动光标到行首 --> $
移动光标到当前页最顶行 --> H
移动光标到当前页最底行 --> L
向前翻一页(Page Up) --> Ctrl + f
向后翻一页(Page Down) --> Ctrl + b
--------------------------------------------------------------------------------
还有在服务器配置中使用vi时,频繁用到的就是vi的搜索功能。在vi命令行的状态下,键入“/”(斜 线)后,vi底部出现“/”,并处于输入等待状态,这时候输入要查找的文字或文字列,然后按回车就可以找到相应的文字或文字列。当有多个对象存在时,敲 “n”(小写)键为查找下一个目标,敲“N”为查找上一个目标。
ctrl+c 切换命令模式
i 插入模式
ZZ 退出VI
PHP错误信息分析
编译PHP脚本时,PHP编译器会尽其所能报告它遇到的第一个问题。这样就产生一个问题:只有当错误出现时,PHP才能将它识别出来(本文后面对此问题进行了详细描述)。正是由于这个缘故,编译器指出出错的那行,从表面上看来可能语法正确无误,或者可能是根本就不存在的一行!
本文中所讲述的内容与您所应用的PHP的版本无关,因为本文所描述的各种错误并不限定于某一特殊版本的特定错误。另外我们假定您是一位初级或者中级程序员,并已经从事编程工作有半年或一年的时间。
编译器的工作方式
要搞清楚编译器为什么会报告某一行上存在错误,首先必须明确编译器解析PHP代码的机制。我并不打算在本文中对此进行详细论述,但是,我们将会讨论一些更易于引发错误的简单概念。
变量声明
如果在一条语句中声明一个变量,具体方式如下所示:
$variable = 'value';
编译器首先求出语句右半部分的值(即等号右边的所有内容)。在一些编程书籍中,将此表示为语句的 RHS (右半部分)。恰恰正是语句的这一部分常常会引发错误。如果使用的语法不正确,就会出现解析错误。
解析错误
Parse error:解析错误,unexpected T_WHILE in c:\program files\apache group\apache\htdocs\script.PHP on line 19
每次确定了前一错误时,解析错误一个接一个地不断出现。因为PHP在第一个解析错误之后就停止执行脚本,调试并纠正这一系列的错误往往会让人觉得特别厌烦。
而且,解析错误具有很少的信息,几乎不报告错误所在的行号。具体原因就是当出现错误时,编译器判定好几行的语法看起来应该是有效的,直至遇到无效的语法,最可能的情形就是表达式中使用了预定义的字词,例如;while = 10; // Bad ? while 就是一个预定义字词,不能分配给一个值
预定义的字词包括 while、function等,如果PHP使用 uses to evaluate your code. 您不能使用这些预定义字词来命名变量,而且如果您非要这样做的话,PHP就会报出更多的错误,这是您无法忍受。
关于这个问题,下面的示例可能会对您有所帮助。请咨询阅读一下下面所示的PHP 代码:
$b = "somevalue"
if($b == "somevalue"){
print "Hello world!";
}
?>
错误位于"$b ="一行(在语句的末端缺少分号),所以错误应该是"解析错误:第3行缺少分号"对吧?而不应该依据解析器判定的:
Parse error: parse error, unexpected T_IF in c:\program files\apache
group\apache\htdocs\ereg2.PHP on line 4
在第4行,if() 语句的语法是正确的。那么,编译器是被什么给搞糊涂了呢?线索就是"unexpected T_IF" 部分。出现 "unexpected T_???"错误时,它所表示的含义为:编译器发现在预定义字不应该出现的位置出现。T_IF 代表 if(), T_WHILE 代表 while(), T_FOR 代表 for()等。
值得庆幸的是,一些错误的原因也很简单:
语句没有使用分号(;)结束,比如上面的示例。字符串中缺少引号。
其他一些常见的错误
我见过的最常见的错误就是,当没有使用大括号( } )结束一个函数或者一个循环时出现的错误,这很可能是最常见,最让人烦的错误。具体代码如下:
function UselessFunction() {
for($i < 0; $i < 10; $i++){
}
将产生下列错误:
Parse error: parse error, unexpected $ in c:\program files\apache
group\apache\htdocs\ereg2.PHP on line 9
由于函数 UselessFunction 没有使用大括号( } )来结束,PHP编译器不断查找表示结束的大括号直至到达文件末尾为止。因为编译器未找到一个匹配的大括号,就会报告文件末尾处有错误。
如果正确地反映了代码的层次结构,错误信息就会变得非常明显。如果没有标明代码的层次结构,那么最后要想查清楚到底忘记了什么也会变得几乎是不可能的。所以,请记住,一定要标明代码的层次结构。Tab键可以很容易地实现这一点。对后续的开发人员来说,把握代码框架并对其进行修改也会更容易一些。
MySQL 错误
另一极其令人讨厌的错误信息就是最常见的MySQL错误,这常常使 PHP新手感到颇为头疼: Warning: Supplied argument is not a valid MySQL result resource in...
上面所报告有错的一行可能是:
while($row = MySQL_fetch_array($result)) {
参数 $result并不是一个有效的资源。在英语中它表示因为查询失败,将无法处理mysql_fetch_array。任一查询的语法无效(您应该将查询复制-粘贴到MySQL 控制台参考来进行测试),或者与数据库的连接失败(这种情况下您应该再次检查用户名和口令等)。
防止错误发生
第一步,智能代码器可采取以下几步来消除下列错误出现:
· 在每一条语句的末尾处,不必考虑添加分号——这应该成为一种习惯。
· 总是要尽可能标明代码的层次结构,这可以使您能够查看是否忘记在if 调用或函数末端等位置添加大括号。
· 请使用可突出显示语法的编辑器(如 HTML-Kit)。有了这类编辑器的辅助,您就能确定是否忘记了添加引号,是否缺少分号等。
结论
本文我们对PHP编译器可报出的一些看起来可能没有什么意义的错误有了一定的了解。我们需要将所学的知识应用到如何避免错误以及错误出现时如何纠正错误。调试是一个开发人员所有工作中的最重要的部分之一。提高调试效率可大大加快整个工作的进度,缩短完成一项工程所需花费的时间,同时还可以明显减轻代码失败所带来的精神压力。
我们编写程序时,无论怎样小心谨慎,犯错总是在所难免的。这些错误通常会迷惑PHP编译器。如果开发人员无法了解编译器报错信息的含义,那么这些错误信息不仅毫无用处,还会常常让人感到沮丧。
$_SERVER详细参数
$_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root相关。
$_SERVER['argv'] #传递给该脚本的参数。
$_SERVER['argc'] #包含传递给程序的命令行参数的个数(如果运行在命令行模式)。
$_SERVER['GATEWAY_INTERFACE'] #服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。
$_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称。
$_SERVER['SERVER_SOFTWARE'] #服务器标识的字串,在响应请求时的头部中给出。
$_SERVER['SERVER_PROTOCOL'] #请求页面时通信协议的名称和版本。如,“HTTP/1.0”。
$_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”“HEAD”,“POST”,“PUT”。
$_SERVER['QUERY_STRING'] #查询(query)的字符串。
$_SERVER['DOCUMENT_ROOT'] #当前运行脚本所在的文档根目录。在服务器配置文件中定义。
$_SERVER['HTTP_ACCEPT'] #当前请求的 Accept: 头部的内容。
$_SERVER['HTTP_ACCEPT_CHARSET'] #当前请求的 Accept-Charset: 头部的内容。例如:“iso-8859-1,*,utf-8”。
$_SERVER['HTTP_ACCEPT_ENCODING'] #当前请求的 Accept-Encoding: 头部的内容。例如:“gzip”。
$_SERVER['HTTP_ACCEPT_LANGUAGE']#当前请求的 Accept-Language: 头部的内容。例如:“en”。
$_SERVER['HTTP_CONNECTION'] #当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。
$_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容。
$_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址。
$_SERVER['HTTP_USER_AGENT'] #当前请求的 User_Agent: 头部的内容。
$_SERVER['HTTPS'] — 如果通过https访问,则被设为一个非空的值(on),否则返回off
$_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址。
$_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名。
$_SERVER['REMOTE_PORT'] #用户连接到服务器时所使用的端口。
$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名。
$_SERVER['SERVER_ADMIN'] #管理员信息
$_SERVER['SERVER_PORT'] #服务器所使用的端口
$_SERVER['SERVER_SIGNATURE'] #包含服务器版本和虚拟主机名的字符串。
$_SERVER['PATH_TRANSLATED'] #当前脚本所在文件系统(不是文档根目录)的基本路径。
$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用。
$_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html”。
$_SERVER['PHP_AUTH_USER'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
$_SERVER['PHP_AUTH_PW'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
$_SERVER['AUTH_TYPE'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型
持续集成CruiseControl电子书
持续集成(Continuous Integration)这个术语源自 XP(极限编程)的一个最佳实践,随着XP 社区在近几年的壮大,XP 的很多实践得到了广泛的推广,持续集成就是其中之一,但是持续集成并非 XP 的专利,持续集成完全可以应用在采取非XP 方法(例如 RUP)的项目里面。持续集成也不是一个新的概念,在这个术语出现之前,daily build提供同样的含义,他们的主要区别就在于实施的频率上,随着 XP 社区的大师级人物 Martin Fowler的一篇《Continuous Integration》正式为其正名,持续集成这个术语就越来越多地出现daily build中。同时,Martin Fowler 所在的公司 ThoughtWorks 开放了其持续集成的工具 CruiseControl 的源代码,持续集成对于大部分开发人员来说就不再只是停留在口头上的漂亮的术语,任何人在掌握了持续集成的基础理论后,都可以使用 CruiseControl 来体会持续集成在项目开发中的巨大威力。
点击:电子书下载
官方网址
http://cruisecontrol.sourceforge.net/
2008年11月21日星期五
2008年国内外经典博客程序点评分析
PJBlog:官方网站:(www.PJhome.net)
由在腾讯负责Q-zone的前台JS设计的 PuterJam(陈子舜)独自开发的基于 ASP + Access 的单用户博客系统,最新版本是PJBlog3 v2.8.2.117,最新版也解决了日志静态化的问题(当年我盼这个功能盼得好苦啊)。PJBlog 具有丰富的插件和模板,良好的可扩展功能,在国内的用户数与 Z-Blog 不相上下(个人观察+猜测)。我用过几个月的 PJBlog ,非常喜欢 PJBlog 的后台,简洁、人性化而不失强大。PJBlog 官方论坛非常活跃,有很多用户热情奉献,新手能够非常快的学习到不少博客技巧。遗憾的是,PJBlog 一直深受 Spam 垃圾留言骚扰(这也是多后来转换到 WordPress 的原因之一),不知道最新版本是否解决了这个问题。另外,PJBlog 的留言中,不能加入评论者的个人 Blog ,让博客之间的“交互性”大打折扣。
ZBlog:官方网站:(www.rainbowsoft.org)
由创始人 zx.asd(朱煊)和 sipo(刘星晨)联合开发的 ASP + Access 单用户博客系统,该程序最大的特点就是支持文章静态化,有利于搜索引擎的收录。另外,Z-Blog 支持在线安装主题和插件,支持 Windows Live Writer 离线可视化写博,大大提高了博客管理的效率。Z-Blog 在国内有大量用户,因此皮肤、插件都很多,可以实现很多个性化功能。
LBS:官方网站:(www.voidland.com)
由 SiC/CYAN 基于 L-Blog 二次开发,全英文界面,用的是 XHTML+CSS 构架,比较合理。不支持静态化,对于 Spam 也不能很好的控制。
Oblog:官方网站:(www.oblog.cn)
一个基于 ASP + Access 的多用户博客系统,是一个专业的博客系统提供商,由北京傲博致远计算机技术有限公司开发运营。Oblog 可免费下载使用,支持静态化,常与 Discuz、PHPWind 整合使用,有很多模板可选。对于有此需要的企业而言,Oblog 是一个不错的选择。
小结:国内 ASP Blog 程序还有很多,不过使用最多的应该是以上四款了。个人建议 PJBlog 和 Z-Blog 都是不错的选择,新手容易上手,也可以在建设博客的过程中学到不少东西。
PHP 类:
WordPress:官方网站:(WordPress.org)
WordPress 是一款基于 PHP + Mysql 的开源博客程序,包括单用户系统与 WordPress MU 多用户系统。WordPress 程序简洁,功能强大(可以打造成一个CMS),依托于各种各样的插件,你可以实现任何想要的功能。WordPress.com 为全球用户提供免费而专业的 BSP 服务,在中国,yo2.cn 也为用户提供可定制的个性化博客服务,适用于没有技术基础的 WordPress 爱好者。WordPress 在全球拥有大量 Fans(我也是其中之一 ),Fans 贡献了大量的主题与插件,良好循环让 WordPress 越来越强大。同时,在国内还有一些 Fans 维护的博客为网友提供 Wordpress 中文版以及WordPress 的最新资讯动态,WordPress 中文站就做得很不错。关于 WordPress ,写再多也无法介绍清楚,只有亲自使用才会明白,如果你没有PHP基础但又十分想加入 WordPress 怀抱,请不要犹豫,Google 是最好的老师。例如:www.biuuu.com
SaBlog-X:官方网站:(www.sablog.net)
由 Angel 独自开发的基于 PHP + Mysql 的单用户博客程序,作者也是 Discuz! Lite 版本的制作者。目前国内还是有很多 Blogger 使用的 SaBlog ,应该是国内最好的 PHP 博客程序了。SaBlog-X 支持静态化,利于 SEO ,对于 Spam 也有较好的防御机制。不过,SaBlog-X 主题、插件较少,可能需要 Blogger 有一定开发能力才能进行相应扩展。
Bo-Blog:官方网站:(www.bo-blog.com)
由 Bob Shen 开发的一款基于 PHP + Mysql 的单用户博客程序,目前国内 PHP 博客中, Bo-Blog 与 SaBlog-X 不相上下。Bo-Blog 的主要优点是模板丰富、插件超多,但程序整体开发更新较为缓慢。
小结:国内 PHP 类博客程序也不止 SaBlog-X 与 Bo-Blog,此外还有 F2Blog、C-Blog、ExBlog、7Blog 等。当然,放眼全球,WordPress 无疑是最优秀最受欢迎和关注的 Blog 程序。
.NET 类:
Bitrac:官方网站:(www.loveyuki.com)
L-Blog的作者 Loveyuki(卫慧杰)开发的博客程序。之前的 L-Blog 是基于 ASP+Access 的小型单用户博客系统,后来停止开发。作者卫慧杰现开发了基于 ASP.NET 2.0 + SQLite 的单用户博客程序,内置 URLRewrite 和页面压缩功能,支持MetaWeblogAPI,自写的 HTML 模板引擎,方便修改风格,完全的可视化编辑环境。目前是内测版本。真是一个精力充沛的博客开发者,对.Net感兴趣的同学可以试试。
Roclog(FC.Roclog?):官方网站:(www.foxcup.com)
由上面说到的卫慧杰的师弟汤尼尔开发的基于 ASP.net 2.0 + SQLite 的小型个人博客系统(好像还可以自己使用 MSSQL 数据库),已经拥有了博客几乎所有的功能,主题包样式文件的制作都很方便并且运行速度快,利用重写模拟了静态文件,合理利用 AJAX 来处理一些数据,最重要的是负载性和稳定性都不输给任何一个 .NET 博客程序,不过好像最近正在和 Foxcup 合并,将来名称有可能会改为 FC.Roclog。
ZJ-Blog:官方网站:(www.zj-blog.com)
基于 ASP.net 1.1 环境开发的单用户博客程序,支持 Access 和 MySQL 两种数据库,其最大的特点是采用 .Net 开发并大量的使用了 Ajax 技术。最新版本是 ZJ-Blog V1.0 Beta2。
小结:.Net 的博客程序还真是没几个好用的,因为要使用微软的 .Net 环境,感觉非常烦琐。不过个人觉得 Bitrac 和 Roclog 都是比较容易使用的系统。
2008年11月19日星期三
vim命令
1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
h (左移) j (下行) k (上行) l (右移)
2. 欲进入vim编辑器(从命令行提示符),请输入∶vim 文件名 <回车>
3. 欲退出vim编辑器,请输入以下命令放弃所有修改∶
或者输入以下命令保存所有修改∶
4. 在正常模式下删除光标所在位置的字符,请按∶ x
5. 在正常模式下要在光标所在位置开始插入文本,请按∶
i 输入必要文本
特别提示∶按下
的命令。
第二讲小结:
1. 欲从当前光标删除至单字/单词末尾,请输入∶dw
2. 欲从当前光标删除至当前行末尾,请输入∶d$
3. 欲删除整行,请输入∶dd
4. 在正常模式下一个命令的格式是∶
[number] command object 或者 command [number] object
其意是∶
number - 代表的是命令执行的次数
command - 代表要做的事情,比如 d 代表删除
object - 代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。
$ (to the end of line), etc.
5. 欲撤消以前的操作,请输入∶u (小写的u)
欲撤消在一行中所做的改动,请输入∶U (大写的U)
欲撤消以前的撤消命令,恢复以前的操作结果,请输入∶CTRL-R
第三讲小结:
1. 要重新置入已经删除的文本内容,请输入小写字母 p。该操作可以将已删除
的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置
于当前光标所在行的下一行。
2. 要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字
符即可。
3. 更改类命令允许您改变指定的对象,从当前光标所在位置直到对象的末尾。
比如输入 cw 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当
前光标到行末的内容。
4. 更改类命令的格式是∶
[number] c object 或者 c [number] object
第四讲小结:
1. Ctrl-g 用于显示当前光标所在位置和文件状态信息。Shift-G 用于将光标跳
转至文件最后一行。先敲入一个行号然后按 Shift-G 则是将光标移动至该行
号代表的行。
2. 输入 / 然后紧随一个字符串是则是在当前所编辑的文档中向后查找该字符串。
输入问号 ? 然后紧随一个字符串是则是在当前所编辑的文档中向前查找该字
符串。完成一次查找之后按 n 键则是重复上一次的命令,可在同一方向上查
找下一个字符串所在;或者按 Shift-N 向相反方向查找下该字符串所在。
3. 如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的
括号上。
4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc
第五讲小结:
1.:!command 用于执行一个外部命令 command。
请看一些实际例子∶
:!dir - 用于显示当前目录的内容。
:!rm FILENAME - 用于删除名为 FILENAME 的文件。
2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
件中。
3. :#,#w FILENAME 可将当前编辑文件第 # 行至第 # 行的内容保存到文件
FILENAME 中。
4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
后面。
第六讲小结:
1. 输入小写的 o 可以在光标下方打开新的一行并将光标置于新开的行首,进入
插入模式。
输入大写的 O 可以在光标上方打开新的一行并将光标置于新开的行首,进入
插入模式。
2. 输入小写的 a 可以在光标所在位置之后插入文本。
输入大写的 A 可以在光标所在行的行末之后插入文本。
3. 输入大写的 R 将进入替换模式,直至按
模式。
4. 输入 :set xxx 可以设置 xxx 选项。
例如:
:set ic (ic就是英文忽略大小写Ignore Case的首字母缩写词).
第七讲小结:
** 使用在线帮助系统 **
Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方
法之一∶
- 按下
- 按下
- 输入 :help <回车>
输入 :q <回车> 可以关闭帮助窗口。
提供一个正确的参数给":help"命令,您可以找到关于该主题的帮助。请试验以
下参数(可别忘了按回车键哦。:)∶
:help w <回车>
:help c_
:help insert-index <回车>
:help user-manual <回车>
第八讲小结:
** 创建一个启动脚本 启用vim的功能 **
Vim的功能特性要比vi多得多,但大部分功能都没有缺省激活。为了启动更多的
功能,您得创建一个vimrc文件。
1. 开始编辑vimrc文件,这取决于您所使用的操作系统∶
:edit ~/.vimrc 这是Unix系统所使用的命令
:edit $VIM/_vimrc 这是Windows系统所使用的命令
2. 接着导入vimrc范例文件∶
:read $VIMRUNTIME/vimrc_example.vim
3. 保存文件,命令为∶
:write
在下次您启动vim的时候,编辑器就会有了语法高亮的功能。您可以继续把您喜
欢的其它功能设置添加到这个vimrc文件中。
提升用户体验的Firefox扩展推荐(含下载)
Firefox的魅力就在于它强大的拓展性。相比于IE、Chrome,乃至Opera,强大的插件支持是Firefox最大的优势。然而对于一个 刚刚接触Firefox的人来说,找到适合自己的扩展很不容易。当然,你可以在Firefox的插件官网找到相关的推荐扩展(Recommend Extensions),但是仍有其不够完备的一面。
下面我结合自己几年的Firefox使用经验来推荐一些绝对实用的扩展,从它们中相信能找到符合每个人习惯的扩展。扩展排名不分先后,按字母顺序排列。
强大的广告过滤插件,在官网下载中国专用的Filter Pack后,基本所有网站的广告都能完全过滤掉,是Firefox必备的插件之一。
2、Aliedit
支付宝安全控件,使用它你就可以用Firefox登陆支付宝了!这个过去让人头疼无比的问题最近终于解决了。常常去淘宝购物的朋友必备插件。
将书签栏、下载栏、扩展栏等等内容完全放到浏览器左侧一个可设为自动隐藏的边栏中,是日常操作更加便捷。
Firefox的自动填表工具,以后在注册论坛、发表评论的时候就不需要重复输入个人信息了,只需一点ID、邮箱就全部填完。
5、BossKey
可以自由设置将Firefox最小化或者关闭到系统托盘图标而不用关闭主程序,同时释放内存。还可以设置老板键一键最小化。对于开机后就基本不关浏览器的人来说非常方便。
对于本来就不大的现实屏幕,多出一行很不常用的菜单栏会很大程度缩小可以显示的页面内容。而CompactMenu可以将菜单栏用一个小小的按钮取 代,并且可以放在导航栏、书签栏边上并隐藏菜单栏。原来我用的是TinyMenu,但是那个插件还需要将导航栏的内容挪到菜单栏再隐藏导航栏。相比之下这 个插件无疑更优秀。
这个插件允许你用鼠标在多个Cookie之间切换。非常适用于在一个网站多用户同时默认登陆。比如你在百度有三个账号,用这个插件你就可以自由的在三个帐户之间切换而不用重新输入密码。非常推荐的一个拓展,就是设置功能还不太完善
对于经常使用Google服务的人来说绝对不能错过,提供了大量的Google服务的个性设置,基本涵盖了所有Google服务。
现在这类的Firefox插件特别多,甚至连FlashGot都加入了这个功能,但我认为这个插件是最好的。下载速度不错,可以从缓存中直接调取,同时还有视频网站推荐功能。(其中包含很多……类的视频网站,而且特殊标识)
每次下载都弹出Firefox内建的下载窗口是不是很烦呢?这个插件将下载窗口集成到了状态栏上方。可以方便的看到下载进度而不需要点开其它窗口,非常推荐!
习惯超级拖拽的朋友一定会需要这个插件,拖拽搜索功能,不需要多介绍了吧?
在打开网页时可以看到加载的速度、图片总数等等内容。两种可选的显示方式,很实用。
很多网站没有自己的图标,当你把它存为书签是就是很难看的文本图标,而这个工具可以让你自由选择图片当作书签的图标。
14、FEBE
强大的备份插件、书签的工具,可以定时备份,这样在重装系统的时候就可以最快速度的恢复重装之前的样子。当然,个人觉得Mozbackup是最好的 备份工具,因为你只需一点就可以恢复原状而不是像FEBE一样仅仅倒出插件的安装文件而需要手动一个个恢复。但是那不是插件,而是单独的软件。想试试的朋 友可以点击这里。
通过这个插件可以方便的从常见的网盘(如box等)上传和下载数据,非常推荐给常用网盘的朋友。
16、FireGestures
鼠标手势是比拖拽搜索更深入人心的快捷操作方式,习惯鼠标手势的一定要试试,而且这个插件的可性非常强大
17、Flashblock
网页中过多的Flash会极大的延缓页面打开的时间,而通常我们想要的Flash只有几个而已,这个插件会自动过滤掉Flash替换成箭头,想要运行某个Flash只需在上面轻轻一点,非常推荐!
18、FlashGot
基本无需多言,FlashGot是Firefox必备的插件之一,用来下载网页内的全部链接,调用外部下载工具如迅雷等等。
19、Foxmarks Bookmark Synchronizer
个人认为必备的插件,可以在线同步书签、密码。尤其对于有多台电脑或多系统的用户,这个插件极大的方便了Firefox的使用。Firefox官方的Wave也可以完成类似功能,但仍在测试中,为正式发布。
20、FoxyProxy
非常强大的代理管理工具,可以设置切换代理,设置过滤名单等等功能。基本涵盖了所有Firefox代理工具的功能,也因此有些难于上手。
Gmail用户必备,可以直接管理邮箱、提示新邮件等等功能。如果你是其他的邮箱或有多个邮箱,可以尝试WebMail Notifier
Google Reader用户必备,用来在状态栏添加Google Reader未读订阅的数目的提醒,点击即可进入Google Reader,非常实用。
想必Google用户都知道Google Toolbar强大的功能吧,这里无需赘述。
24、Greasemonkey
通过向网页内添加一些Java脚本,Greasemonkey使你在每次访问相应页面的时候改变它的功能和外观,从而得到更好的服务体验。网络上有 上千个可供你选择的Greasemonkey脚本,你几乎可以定制所有你能想到的功能。在它们之中有一些脚本是非常有用和流行的。Firefox用户绝对 必备的插件,它使Firefox的功能呈指数增长!
25、IE Tab
又是一个Firefox必备的扩展。在很多网页设计上不符合标准的今天,必然会遇到必须使用IE才能正确显示和使用的网页。尤其是网银。而每次都打 开IE是不是很费事呢?IE Tab让你一键将当前页面或链接在Firefox内直接调用IE内核打开。同时可设定某些固定网页始终用IE打开。非常实用!
26、MediaWrap
用来纠正网页中不规范的媒体,从而能够正常播放。不得不用的一个插件。
27、Menu Editor
可以自定义菜单栏的插件,去掉不常用的,把自己常用的放在最上方。能很大程度提高使用感受。
28、QuickProxy
前面说到的FoxyProxy功能过于强大,而很多时候我们仅仅需要在代理和无代理之间切换而已,那么QuickProxy就是你最好的选择。
29、Show Picture
很多时候页面内的图片无法显示,这时你就需要右键点击“Show Picture”来显示图片,很实用。
30、Speed Dial
快速拨号是Opera最早实现的功能,打开一个新页面即可在多个常用的网址中选择,非常方便的功能。现在Firefox也可以通过这个插件实现了。
31、Tab Mix Plus
非常非常强大的浏览器标签设置工具。可以改变书签的外观、操作,比如双击关闭标签、地址栏强制在新标签页中打开、在标签上显示进度条等等。还带有崩 溃恢复等功能,总之是Firefox必备的插件之一,设置项目非常多,仔细研究一下Firefox就像是专门为你设计的浏览器!
为什么要推荐这个插件呢?因为Tab Mix Plus的功能太强大,需要设置的太多,而这个插件功能相对就少了很多,但却包含了必要的大部分功能,所以用这个插件代替也是很好的选择。在Tab Mix Plus为更新兼容3.0之前我就一直在使用这个插件。
向浏览器中添加非常多的定制按钮。可完成更多的功能,比如打开刚刚关闭的标签,一键更新,Yahoo、Gmail按钮等等非常多的功能。
上述扩展基本都是本着增强使用体验的出发点而推荐的,所以其中不包括一些也很常用的美化、个性化Firefox的插件,比如Colorful Tabs,Cooliris,FlagFox,TimaTracker等等。相信上述插件一定可以给你带来更好的Firefox体验,让你一天也不想多用 IE。
2008年11月18日星期二
浅析主流SNS应用之Top10
首先我们将应用分为三种:1、以需求为中心,工具型应用(如心理测试,酷狗音乐盒);2、以用户为中心,娱乐型应用(如挖金子,超级玛丽);3、以互动为中心,维持现有关系及交友的交互型应用(如葵花点穴手,朋友印象,超级大富翁)。随着Manyou开放平台应用使用率的不断提高,用户也对应用这一概念有了初步认识,但大部分用户对应用的选择仍处于被动阶段。而这时,交互型应用迎来了迅速崛起的机遇,该型应用极大的满足会员之间直接或间接交流的同时,邀请奖励这种病毒式的营销模式使得传播变得迅速有效。所以在Manyou开放平台上,交互型应用在短时间内迅速崛起,成为应用的主流,但从现有应用的人气来看,交互型的应用并没有完全占据应用主流排行傍,最明显的就是在manyou上线以来“心理测试”的用户人气一直位居前列,而且发展势头稳健。可见应用的交互固然重要,若能满足用户根本需求也可在主流应用中占据一席之地。
目前,SNS大部分定义为交友,即使像驴友录这样比较垂直的站点仍然脱离不了交友这条主线,这也完全解释了交互型应用为何能在短时间内成为后起之秀,人气飙升。目前排在top10的应用中,“葵花点穴手”故事背景及玩法别具一格,页面也经过精心设计,可谓创意辈出,从应用内送礼物到公用留言板,一个小型的社会体系被这部优秀的应用体现的淋漓尽致,更大程度的满足了交友这一需求。
然而并不是所有的应用都需要在功能上面面具到,但具有一定完善程度的体系不仅能增加用户粘度,更能给用户带来归属感。xiaonei大力推行的狗狗应用,就是通过宠物对会员的吸引增加用户的归属感。另一个发展迅速的应用“超级大富翁”在黏度上远远超过了同类型的其它应用,虽然应用在前段时间做了升级调整,对热衷的用户带来了轻微的困扰,但升级之后随着功能的增加和完善,用户安装量和使用频率大幅度提升,放眼望去,颇有满站皆是“大富翁”的繁荣景象。而一直被很多人认为美工不尽人意的“反恐精英”也以不俗的表现跻身十大主流应用,便捷有效并赠送大量积分的邀请使得“反恐精英”在用户群体中飞速发展,其 “真人pk”的场景也能吸引很大一部分用户——没时间去户外cs,坐在电脑前YY,也是个不错的选择。可见交互型应用的完善体系在其发展壮大的道路上起着至关重要的作用,而站长对应用有一定的了解才能更好的通过合适的应用突出站点特色。
通过以上分析,很多人会以为稳坐安装量前排的肯定是非交互型应用莫属,但事实非已。前面我们提到了“心理测试”人气居高不下,而紧随其后应用却是是最简单不过的FLASH游戏“挖金子”。为何这样一个不靠排名,一个不靠邀请的应用能在用户群体中占据如此高的地位,其实我们站在用户的角度思考就很容易找到答案。
UCenter Home站点的核心由人构成,而人本身对自己信息有着高度的关注。回想一下,当你拿到一张有自己照片的集体照,是否会按照自己在照片中的位置先找到自己,然后再去找其它人——科学证明90%以上的人都会先找自己。而用户通过“心理测试”可以得到自己想要的信息,增加对自己的了解。在年轻人中流行的星座也是同样的道理,所以“心理测试”居高不下的安装量可见一斑。而“挖金子”这样一个再普通FLASH的人气紧随其后,这就需要我们深思。若说“挖金子”这个 FLASH游戏经典,那“超级玛丽”在名气上要更大一些,但对比后不难发现,“挖金子”操作简单,过关容易,玩到中期的时候满屏幕的钻石可以给会员带来视觉上和精神上极大的满足,但在中后期的钻石枯少也使得玩家难以一直通关,相比“超级玛丽”,挖金子更具有上班族打发时间消遣的定位——有意思,时间短,易操作,可控性强,FLASH版的游戏可是很少有能存档以后继续玩的。仅仅是从玩家喜好来讲“挖金子”还不足以达到现有的成绩,在页面右侧的本月和全站排行榜这么一个简单的激励体系却是起到了四两拨千斤的作用,有奖只是激励的一种方式,排行也很有效。可见只要抓住了用户需求,工具和娱乐型应用完全能在广大的用户群体中开拓一份市场。
通过以上分析,想必大家对应用情况有了一定的了解,站长朋友们可以根据自己站点情况,选择性的自主推荐能够提升站点人气的应用,而开发者也不难发现 Manyou开放平台的应用特点——在应用的交互和奖励机制上多下功夫,深挖用户心理,才能在Manyou开放平台众多应用中脱颖而出。那么,下面小编给大家奉上主流应用top10:
心理测试
用户人气: ☆☆☆☆☆
娱乐指数:☆☆☆
交互指数:☆☆
界面美工:☆☆
用户需求:☆☆☆☆☆
上榜理由:服务用户,满足用户最基本的需求,才能拥有如今绝对优势的群众基础。用户对自身的关注永远是第一位,只有对用户心理研究透彻才能更好的发展市场。
挖金子
用户人气: ☆☆☆☆☆
娱乐指数:☆☆☆
交互指数:☆☆
界面美工:☆☆
用户需求:☆☆☆☆
上榜理由:经典的挖金子完全能够满足上班族打发时间时对flash游戏的定位——有意思,时间短,易操作,可控性强;另外右侧的排行榜对不少的玩家都是最直接的刺激。
葵花点穴手
用户人气: ☆☆☆☆☆
娱乐指数:☆☆☆☆
交互指数:☆☆☆☆☆
界面美工:☆☆☆☆
用户需求:☆☆☆
上榜理由:故事背景及玩法别具一格,页面也经过精心设计,可谓创意辈出,从应用内送礼物到公用留言板,一个小型的社会体系被这部优秀的应用体现的淋漓尽致,完善的体系会不仅仅能增加用户粘度,更能增加用户的归属感。
潮男潮女
用户人气: ☆☆☆☆
娱乐指数:☆☆☆☆
交互指数:☆☆☆☆☆
界面美工:☆☆☆
用户需求:☆☆☆
上榜理由:看似简单的打分却能真实的反应用户在群体中的人气,满足用户对了解自己在群体中的被关注程度,若该应用开发者能够将现有个人得分由平均分改成总分,并加强邀请机制,相信“潮男潮女”会有更好的发展。
超级大富翁
用户人气: ☆☆☆☆
娱乐指数:☆☆☆☆☆
交互指数:☆☆☆☆☆
界面美工:☆☆☆☆
用户需求:☆☆☆
上榜理由:对应用深挖,不断升级才会使得应用有更加持久的魅力及影响力,虽然上次升级的时间有些长,但用户对“财富”追求的热情脚部却是丝毫不受影响,升级后增加的“超级城市”极大程度上提高了玩家的热情。希望开发者能在升级改动上避开用户在线高峰期,发展的更好。
游戏厅
用户人气: ☆☆☆
娱乐指数:☆☆☆☆☆
交互指数:☆☆
界面美工:☆☆☆
用户需求:☆☆☆☆☆
上榜理由:华丽的界面,精心挑选的游戏,让人回想起十几年前那拥挤狭小的街头游戏厅,高手买一个币打通关,旁边必定围上一大群人,精彩之处喝彩不断。后续能在游戏数量上再加大力度相信一定会创下辉煌的业绩。
反恐精英
用户人气: ☆☆☆
娱乐指数:☆☆☆☆
交互指数:☆☆☆
界面美工:☆
用户需求:☆☆☆
上榜理由:看似粗略的pk场地首先在视觉冲击上给用户带来不一样的体验,同时易操作和娱乐性还是大把的吸引了不少爱好枪战的用户。希望开发者能出更多的精品应用。
朋友印象
用户人气: ☆☆☆
娱乐指数:☆☆☆☆
交互指数:☆☆☆
界面美工:☆☆
用户需求:☆☆☆
上榜理由:想知道你留给朋友的印象是什么吗,安装朋友印象,大家自然会悄悄留下评价,像心理测试一样,用户对自身的关注,开发者不可忽视。
投票
用户人气: ☆☆☆
娱乐指数:☆☆☆☆
交互指数:☆☆
界面美工:☆☆☆
用户需求:☆☆☆
上榜理由:没想到吧,投票也是一种娱乐方式,这在bbs上是很难操作的,千奇百怪的投票,但使用者置身其中时还会认为这是传统意义的投票么?娱乐无处不在!同时小编发现,站长可以在投票应用的第四个选项卡中选择适合站点的进行导入。导入有趣的投票和用户一起分享快乐!
德克萨斯扑克
用户人气: ☆☆
娱乐指数:☆☆☆☆☆
交互指数:☆☆☆☆☆
界面美工:☆☆☆☆☆
用户需求:☆☆
上榜理由:优秀的引导系统,真人感觉的扑克竞技效果,一掷千金的豪爽,虽然上线不久但发展势头极为强劲,颇有当年联众的感觉。
mozilla美国工程师两秒钟制造百度山寨版
下面是ubiquity的安装方法截图:
强悍的ubiquity插件的另一功能:翻译(这个功能的厉害之处是只要用鼠标选定区域文字,然后就可以用简单的命令来翻译被选文字了。我看翻译的效果很不错,很准确 )
我经常使用开源软件,不过这一次和mozilla的两位工程师的交流还是让我收获很多,国内的开源社区需要好好学习,大家都如此聪明,所以才有这么 多酷的插件。你还在用ie吗?其实firefox有一个ie插件,也可以实现firefox用ie模式运行,既然这样,我们放弃笨重ie的时间也到了。
无论是firefox还是facebook,他们都是以一种开放的形态来面对用户和开发者,这应该是互联网发展的趋势—把企业的产品开放,让他们的产品变成我们的产品。
2008年11月17日星期一
CMS开发人员了解产品是关键
国内CMS的发展到今天应该说已经非常的成熟了,拥有多种程序语言开发的多种产品;从开源到免费,应有尽有。但始终没一家敢出来说自己的市场份额第 一,为什么呢?因为产品其实差不多,没什么特色的功能或是其他什么原因,能将自己与对手拉开距离。也许有人说我在吹牛,CMS还不都是差不多的,发布文 章、下载、分类信息等等,那从哪里能将对手拉开距离呢?
其实我也不知道,因为中国的站长实在太多了,除了定制开发,否则真的很难满足用户的胃口。近日在Dede论坛甚至见有用户提出要开发USB Key登陆,这就足以说明了众口难调的道理。
每一个站长用户的心目中都有一个属于自己的CMS,总是在设想,要是有个这样的程序,是多么完美啊。其实他们不明白,就算是自己有能力开发,也未必能够满足自己。那作为CMS开发者就无需去听一些用户太过琐碎的建议。
从界面(前台)来说,再怎么漂亮、精美的模板一旦被内置了都会被的及其平凡,甚至丑陋,原因就在于泛滥了,随手可得。所以,处理内置模板的办法最简 单就是制作一套朴素但大气的模板,国内的动易这方面就做的比较好,好多个版本内置模板都一成不变,但直到现在仍旧可以找到许多只是在默认模板基础上简单修 改的网站。一劳永逸,因为这确实没必要在每个版本中都去花费太多的经历。
前台属于个性化的范畴,既然是个性化,那么就必须在灵活度上下功夫,方便用户才是真的,最好能让会点HTML的就能做模板,至于怎么才能更灵活,那就是你开发者的事情了,只要时刻记着,用户不是程序员。模板这点国内DedeCms做的很不错,对于我这个菜鸟来说,够简单。
功能实用性,现在的CMS我越来越不愿意用了,原因是都把自己当微软、当QQ了,一版比一版大,能内置的都给内置了,文章、下载、分类信息、Flash、电影、图片,产品、黄页……,试图通过此举让自己的产品适合所有人,殊不知用户的胃口还比较怪,太臃肿了用户也不买账。
其实在我个人的心里很早就有这么一个CMS,说他是万能的他真的是万能的,说他是傻瓜的其实他也足够傻瓜。这个神奇的CMS到底什么样呢?
只有一个单独的核心框架,需要的功能在此基础上安装,就好比是一个操作系统,需要的功能通过下载程序来实现。并且当不需要的时候能够提供完美卸载,在后台不会留下任何痕迹。这样的一个CMS才是万能的,开源不开源根本无所谓,只要开放API接口,实现任何功能都可以。
想法固然完美,但真正实现起来需要有多大的难度,我一点也不明白。最近听说DedeCMS V5.3就是只内置了文章,其余功能都通过模块后期安装实现,所以我很是期待,但当我拿到测试版的时候,依然有些失望,并不是自己所想象的那么完美。当然也许是内测版的原因吧。
一厢情愿的把自己的想法说完,其实不知道有多少人会去关心这个问题,在我看来CMS的成功不在内置了多少模块,有了多少功能。CMS真正的灵活性并没有多少人理解,其实真正的灵活是在简单实用的基础上,而非针对开发人员那所谓的灵活。
真正的CMS是一个平台,能够让开发者与站长同时获利的平台。好比Windows,好比iPhone,提供一个让程序员通过开发插件而获利的平台。
鉴于自己是个技术白痴,许多想法不太成熟,也许会让开发者们笑掉大牙,所以提前闭嘴了。(文/刘克维)
2008年11月14日星期五
AWSTATS性能优化
之前看过awstats官方的优化建议 awstats benchmark(中文翻译在这里), 除了DNSLookup此参数影响较大外,其他的一些参数优化并不能带来非常明显的性能提升,当然这些也是有必要去做的。
awstats官方给出的建议是当访问量超过 4,000,000/月时,推荐你使用Analog或者Webalizer ,这两款统计程序确实快!但是我们有不得不用awstats的理由。对于某些大的门户网站和公司来说,必然会自己开发一套统计系统进行实时统计,这种做法的好处这里就不多说了,但如果仅仅为了得知每天的IP、UV、PV及页面访问情况等,自己开发的成本无疑是一笔不小的开销。但对于日访问量上千万的站点来说,awstats的龟速实在让人无法忍受。
我们网站的日PV至发帖日为止是4000万左右,至今仍在以50-60%/月的速度在增加,日志解压缩后的大小将近200G, awstats每天自动对日志进行分析,整个统计时间大概是16-17小时之间。服务器配置:Xeon双核 1.6 * 2 ,4G内存 , 147G硬盘。
147G的硬盘当然无法解开100多G的日志文件外加一周内的日志,还不算系统自身所占用的磁盘空间。
所以这里我们用到了zcat , 在chedong的AWStats的千万级日志解决方案这篇文章中曾经提到过。zcat确实是一个好东西,可以不用解压缩对gzip、bz2等压缩文件进行输出,而根本不影响统计速度,甚至有所提高,因为perl在执行大文件操作时性能会受到影响。
要知道,加载一个页面同时也加载了许多图片、js、css等文件,我们假设这些访问记录都是在一个日志文件中,那么图片的记录就占了所有访问记录的80%以上。
那么,我们只需要过滤掉这些信息,统计时间也会降至原有时间的20% !
具体如下:
./awstats.pl -update -config=test -LogFile=”/bin/zcat test.log.gz |grep -v ‘.gif\|.png\|.jpg\|.js\|.css’ |”
这是使用了单独域名的前提下,再就是我们可以将组件单独拿到另外的域名来加载,这样达到了过滤的效果。(使用单独域名在大多数情况下不利于网站前端性能,这里不做讨论,详细请参考此文第八条)
第二步,可以通过修改awstats.pl文件来进行,其中 $LIMITFLUSH 默认值为5000,可以根据服务器自身内存进行增加,我增加到了100000,性能提高很明显。
如果你需要统计多个域名的日志,多核、多CPU的服务器则可以开启多个进程同时在后台进行分析,在shell中加上wait就可等待所有进程执行完后再进行之后的html生成。
2008年11月13日星期四
校内网开放平台宣布支持谷歌Open Social
腾讯科技讯 11月13日消息,校内网宣布,校内网开放平台正式支持Google的Open Social标准,允许开发者在校内网上将Open Social的开发标准用于开发应用插件程序(App)。
这是校内网在开放平台后,采用的第二套开发标准,作为Google的合作方之一,校内网方面表示“开放”是未来的方向,很愿意和任何开放平台合作并促进互联网的“开放”时代到来。
据校内网开放平台负责人介绍,校内网上第一个基于Open Social标准制作的App已经在测试阶段,这款由美国开发团队Rockyou开发的“Super Pet”除了可以在校内网上运行外,还可以在任何已经加入“Open Social”的社区网站,如Google的Orkut、天涯、51、豆瓣等网站上运行。
“从我们开放平台的那天开始,就认定了‘开放’是互联网的将来。”校内网开放平台负责人称:“所谓开放,是整个‘互联网的开放。所以我们很高兴加入Google的Open Social计划,也希望和其他开放了平台的网站一起,共同探讨开放之路。”
据了解,校内网是从今年7月8日开始正式开放平台。此前,媒体普遍认为2008年是互联网的开放年,中国互联网开始出现像校内网、Google中国、淘宝、豆瓣等最早的“开放平台”实践者。
2008年11月12日星期三
linux kill用法 、killall、pkill、xkill
终止一个进程或终止一个正在运行的程序,一般是通过 kill 、killall、pkill、xkill 等进行。比如一个程序已经死掉,但又不能退出,这时就应该考
虑应用这些工具。
另外应用的场合就是在服务器管理中,在不涉及数据库服务器程序的父进程的停止运行,也可以用这些工具来终止。为什么数据库服务器的父进程不能用
这些工具杀死呢?原因很简单,这些工具在强行终止数据库服务器时,会让数据库产生更多的文件碎片,当碎片达到一定程度的时候,数据库就有崩溃的
危险。比如mysql服务器最好是按其正常的程序关闭,而不是用pkill mysqld 或killall mysqld 这样危险的动作;当然对于占用资源过多的数据库子进程
,我们应该用kill 来杀掉。
1. kill
kill的应用是和ps 或pgrep 命令结合在一起使用的;
kill 的用法:
kill [信号代码] 进程ID
注:信号代码可以省略;我们常用的信号代码是 -9 ,表示强制终止;
举例:
[root@localhost ~]# ps auxf |grep httpd
root 4939 0.0 0.0 5160 708 pts/3 S+ 13:10 0:00 \_ grep httpd
root 4830 0.1 1.3 24232 10272 ? Ss 13:02 0:00 /usr/sbin/httpd
apache 4833 0.0 0.6 24364 4932 ? S 13:02 0:00 \_ /usr/sbin/httpd
apache 4834 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
apache 4835 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
apache 4836 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
apache 4840 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
我们查看httpd 服务器的进程;您也可以用pgrep -l httpd 来查看;
我们看上面例子中的第二列,就是进程PID的列,其中4830是httpd服务器的父进程,从4833-4840的进程都是它4830的子进程;如果我们杀掉父进程4830
的话,其下的子进程也会跟着死掉;
[root@localhost ~]# kill 4840 注:杀掉4840这个进程;
[root@localhost ~]# ps -auxf |grep httpd 注:查看一下会有什么结果?是不是httpd服务器仍在运行?
[root@localhost ~]# kill 4830 注:杀掉httpd的父进程;
[root@localhost ~]# ps -aux |grep httpd 注:查看httpd的其它子进程是否存在,httpd服务器是否仍在运行?
对于僵尸进程,可以用kill -9 来强制终止退出;
比如一个程序已经彻底死掉,如果kill 不加信号强度是没有办法退出,最好的办法就是加信号强度 -9 ,后面要接杀父进程;比如;
[root@localhost ~]# ps aux |grep gaim
beinan 5031 9.0 2.3 104996 17484 ? S 13:23 0:01 gaim
root 5036 0.0 0.0 5160 724 pts/3 S+ 13:24 0:00 grep gaim
或 [root@localhost ~]# pgrep -l gaim
5031 gaim
[root@localhost ~]# kill -9 5031
2. killall
killall 通过程序的名字,直接杀死所有进程,咱们简单说一下就行了。
用法:killall 正在运行的程序名
killall 也和ps或pgrep 结合使用,比较方便;通过ps或pgrep 来查看哪些程序在运行;
举例:
[root@localhost beinan]# pgrep -l gaim
2979 gaim
[root@localhost beinan]# killall gaim
3. pkill
pkill 和killall 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。
应用方法:
#pkill 正在运行的程序名
举例:
[root@localhost beinan]# pgrep -l gaim
2979 gaim
[root@localhost beinan]# pkill gaim
4. xkill
xkill 是在桌面用的杀死图形界面的程序。比如当firefox 出现崩溃不能退出时,点鼠标就能杀死firefox 。当xkill运行时出来和个人脑骨的图标,哪个
图形程序崩溃一点就OK了。如果您想终止xkill ,就按右键取消;
xkill 调用方法:
[root@localhost ~]# xkill
二.Linux的kill命令与信号控制
信号是用来与守护程序和进程通信的。任何活动任务都是一个进程,而守护程序是等待对某些事件做出反应或者按照日程安排执行任务的后台服务。一个
程序必须有建在其中的信号处理程序用于捕获和应答信号。在LINUX中的signal 参考指南解释了各种不同信号和这些信号的用途。信号是由“kill”命令
发出的。kill -l命令可以显示一个可用信号列表及其编号。
所有的守护程序和进程都有一个进程ID(PID),例如使用ps命名所显示的内容:
$ ps aux
USER PID %CPU %MEM TTY STAT COMMAND
root 1 0.0 0.1 ? S init [2]
105 7783 0.0 0.2 ? Ss /usr/bin/dbus-daemon --system
hal 7796 0.0 0.7 ? Ss /usr/sbin/hald
postfix 7957 0.0 0.2 ? S qmgr -l -t fifo -u -c
nagios 8371 0.0 0.2 ? SNs /usr/sbin/nagios /etc/nagios/nagios.cfg
这个输出是经过简化的。你在系统中可以看到更多的行和栏目。如果某些进程消耗了你的全部CPU或者内存,你可以在这个输出的%CPU和%MEM列中发现它们
。找到失控的进程的一种更快捷的方法是使用top命令,因为按照默认的设置,使用占用CPU资源最多的进程在最上面显示。我们可以使用一条“yes”命令
来测试一下:
$ yes carla is teh awesum
这个命令将以很高的速度反复显示“carla is teh awesum”,直到你停止它运行。这将使你的CPU使用率达到警戒线。
$ top
...
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12144 carla 25 0 31592 17m 13m R 93.4 3.5 0:50.26 konsole
22236 carla 15 0 2860 468 400 S 4.3 0.1 0:00.97 yes
分析一下这个结果,你会发现一些有趣的事,你会发现,占用CPU最多的程序是konsole虚拟终端程序,而不是“yes”命令,这是因为“yes”命令是在
konsole终端程序中运行的。如果在一个“真正的”控制台(按Ctrl+alt+f2键)中运行同样的命令序列,你将看到“yes”命令被排在第一位。
有许多停止“yes”命令运行的方式。如果你要回到运行它的shell中,按CTRL+c键就可以了。或者你可以在另一个shell中用“kill”命令停止“yes”命
令的运行,Kill命令后面跟PID或者命令名称,如下如示:
$ kill 22236
或者
$ killall yes
按 CTRL+c键发出一个SIGINT(信号2),这个信号是键盘要求取得控制权的中断信号。kill和killall这两个命令按照默认的设置都发出一个 SIGTERM信号
(编号15)。程序中可以设置对SIGTERM信号(15)是捕捉或者忽略,或者以不同的方式解释。因此,如果你的程序对于KILL命令的反应与你预期不同,很可能
是被KILL的目标程序的问题。
终止一个父进程通常也终止了它的子进程。不过,情况并不总是如此。你知道子进程是什么吗?使用ps命令加上-f选项就可以看到,如下所示:
$ ps axf
22371 ? R 2:35 _ konsole [kdeinit]
22372 pts/3 Ss 0:00 | _ /bin/bash
24322 pts/3 S+ 0:00 | | _ yes carla is teh awesum
22381 pts/4 Rs 0:00 | _ /bin/bash
24323 pts/4 R+ 0:00 | | _ ps axf
现在,回到SIGHUP的话题
SIGHUP的发音是“sig-hup”,是signal hangup的缩写,含义是“中止信号”。你如何发送一个SIGHUP信号呢?这里有几种方式:
# kill -HUP [pid]
# killall -HUP [process-name]
# kill -1 [pid]
# killall -1 [process-name]
因此,你可以使用PID或者名称,信号名称或者号码。那么为什么要这样做而不使用/etc/init.d/foo命令重新启动呢?使用它们自己的 init(初始化)文件
来控制服务是优先选择的方式,因为这些文件通常包含健全和错误检查以及额外的功能。使用“kill”命令和信号的主要原因是尽可能明确地终止挂起和
失控的进程,而不必重新启动或者登出。
终止进程
正如你在关于信号的man page中所看到的,有十几种控制进程的方法。下面是一些常用的方法:
kill -STOP [pid]
发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。
kill -CONT [pid]
发送SIGCONT (19,18,25)重新开始一个停止的进程。
kill -KILL [pid]
发送SIGKILL (9)强迫进程立即停止,并且不实施清理操作。
kill -9 -1
终止你拥有的全部进程。
SIGKILL和SIGSTOP信号不能被捕捉、封锁或者忽略,但是,其它的信号可以。所以这是你的终极武器。
Bash shell的Kil命令l
Bash外壳包含一个内置的kill命令,当执行下面命令:
$ type -all kill
kill is a shell built-in
kill is /bin/kill
命令的结果表明有两个kill命令,一个是BASH的内置命令,另一个是/bin/kill可执行程序。一般来说这两个命令不太可能遇到冲突的情况,不过,如果你
确实遇到了kill命令行为异常时,你可以明确的指定/bin/kill命令。
你一定要进一步查阅下面的资源中列出的参考资源来了解Linux中kill的妙用,因为这是你进入维护Linux系统领域的门票。这些知识能够让你像做外科手
术一样对系统进行维护,而不用在遇到问题时每一次都重新启动系统,就像我们知道的某些蹩脚的操作系统那样。
资源
Linux Cookbook一书的第七章“开始和终止Linux”
bash (1) - GNU Bourne-Again Shell
yes (1) - 在被终止前反复打印字符
signal (7) - 可用信号列表
ps (1) - 报告当前进程的快照
kill (1) - 向一个进程发出信号
killall (1) - 按名字消灭进程
pkill (1) - 根据名字和其它属性查看或者发出进程信号
skill (1) - 发送一个信号或者报告进程状态
xkill (1) - 按照X资源消灭一个客户程序
ps命令
ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了.
ps [选项]
下面对命令选项进行说明∶
-e显示所有进程.
-f全格式.
-h不显示标题.
-l长格式.
-w宽输出.
a显示终端上的所有进程,包括其他用户的进程.
r只显示正在运行的进程.
x显示没有控制终端的进程.
O[+|-] k1 [,[+|-] k2 [,…]] 根据SHORT KEYS、k1、k2中快捷键指定的多 级排序顺序显示进程列表.对于ps的不同格式都存在着默认的顺序指定.这些默 认顺序可以被用户的指定所覆盖.其中“+”字符是可选的,“-”字符是倒转指 定键的方向.
最常用的三个参数是u、a、x.
ps命令常用用法
1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。
2)ps -A 显示所有程序。
3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
4)ps -e 此参数的效果和指定"A"参数相同。
5)ps e 列出程序时,显示每个程序所使用的环境变量。
6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
7)ps -H 显示树状结构,表示程序间的相互关系。
8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
9)ps s 采用程序信号的格式显示程序状况。
10)ps S 列出程序时,包括已中断的子程序资料。
11)ps -t<终端机编号>
指定终端机编号,并列出属于该终端机的程序的状况。
12)ps u
以用户为主的格式来显示程序状况。
13)ps x
显示所有程序,不以终端机来区分。
最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。
grep命令介绍
◎语法: grep [options]
PATTERN [FILE...]
grep用以在file内文中比对相对应的部分,或是当没有指定档案时,
由标准输入中去比对。 在预设的情况下,grep会将符合样式的那一行列出。
此外,还有两个程式是grep的变化型,egrep及fgrep。
其中egrep就等同於grep -E ,fgrep等同於grep -F 。
◎参数
1. -A NUM,--after-context=NUM
除了列出符合行之外,并且列出後NUM行。
ex: $ grep -A 1 panda file
(从file中搜寻有panda样式的行,并显示该行的後1行)
2. -a或--text
grep原本是搜寻文字档,若拿二进位的档案作为搜寻的目标,
则会显示如下的讯息: Binary file 二进位档名 matches 然後结束。
若加上-a参数则可将二进位档案视为文字档案搜寻,
相当於--binary-files=text这个参数。
ex: (从二进位档案mv中去搜寻panda样式)
(错误!!!)
$ grep panda mv
Binary file mv matches
(这表示此档案有match之处,详见--binary-files=TYPE )
$
(正确!!!)
$ grep -a panda mv
3. -B NUM,--before-context=NUM
与 -A NUM 相对,但这此参数是显示除符合行之外
并显示在它之前的NUM行。
ex: (从file中搜寻有panda样式的行,并显示该行的前1行)
$ grep -B 1 panda file
4. -C [NUM], -NUM, --context[=NUM]
列出符合行之外并列出上下各NUM行,预设值是2。
ex: (列出file中除包含panda样式的行外并列出其上下2行)
(若要改变预设值,直接改变NUM即可)
$ grep -C[NUM] panda file
5. -b, --byte-offset
列出样式之前的内文总共有多少byte ..
ex: $ grep -b panda file
显示结果类似於:
0:panda
66:pandahuang
123:panda03
6. --binary-files=TYPE
此参数TYPE预设为binary(二进位),若以普通方式搜寻,只有2种结果:
1.若有符合的地方:显示Binary file 二进位档名 matches
2.若没有符合的地方:什麽都没有显示。
若TYPE为without-match,遇到此参数,
grep会认为此二进位档案没有包含任何搜寻样式,与-I 参数相同。
若TPYE为text, grep会将此二进位档视为text档案,与-a 参数相同。
Warning: --binary-files=text 若输出为终端机,可能会产生一些不必要的输出。
7. -c, --count
不显示符合样式行,只显示符合的总行数。
若再加上-v,--invert-match,参数显示不符合的总行数。
8. -d ACTION, --directories=ACTION
若输入的档案是一个资料夹,使用ACTION去处理这个资料夹。
预设ACTION是read(读取),也就是说此资料夹会被视为一般的档案;
若ACTION是skip(略过),资料夹会被grep略过:
若ACTION是recurse(递),grep会去读取资料夹下所有的档案,
此相当於-r 参数。
9. -E, --extended-regexp
采用规则表示式去解释样式。
10. -e PATTERN, --regexp=PATTERN
把样式做为一个partern,通常用在避免partern用-开始。
11. -f FILE, --file=FILE
事先将要搜寻的样式写入到一个档案,一行一个样式。
然後采用档案搜寻。
空的档案表示没有要搜寻的样式,因此也就不会有任何符合。
ex: (newfile为搜寻样式档)
$grep -f newfile file
12. -G, --basic-regexp
将样式视为基本的规则表示式解释。(此为预设)
13. -H, --with-filename
在每个符合样式行前加上符合的档案名称,若有路径会显示路径。
ex: (在file与testfile中搜寻panda样式)
$grep -H panda file ./testfile
file:panda
./testfile:panda
$
14. -h, --no-filename
与-H参数相类似,但在输出时不显示路径。
15. --help
产生简短的help讯息。
16. -I
grep会强制认为此二进位档案没有包含任何搜寻样式,
与--binary-files=without-match参数相同。
ex: $ grep -I panda mv
17. -i, --ignore-case
忽略大小写,包含要搜寻的样式及被搜寻的档案。
ex: $ grep -i panda mv
18. -L, --files-without-match
不显示平常一般的输出结果,反而显示出没有符合的档案名称。
19. -l, --files-with-matches
不显示平常一般的输出结果,只显示符合的档案名称。
20. --mmap
如果可能,使用mmap系统呼叫去读取输入,而不是预设的read系统呼叫。
在某些状况,--mmap 能产生较好的效能。 然而,--mmap
如果运作中档案缩短,或I/O 错误发生时,
可能造成未定义的行为(包含core dump),。
21. -n, --line-number
在显示行前,标上行号。
ex: $ grep -n panda file
显示结果相似於下:
行号:符合行的内容
22. -q, --quiet, --silent
不显示任何的一般输出。请参阅-s或--no-messages
23. -r, --recursive
递地,读取每个资料夹下的所有档案,此相当於 -d recsuse 参数。
24. -s, --no-messages
不显示关於不存在或无法读取的错误讯息。
小: 不像GNU grep,传统的grep不符合POSIX.2协定,
因为缺乏-q参数,且他的-s 参数表现像GNU grep的 -q 参数。
Shell Script倾向将传统的grep移植,避开-q及-s参数,
且将输出限制到/dev/null。
POSIX: 定义UNIX及UNIX-like系统需要提供的功能。
25. -V, --version
显示出grep的版本号到标准错误。
当您在回报有关grep的bugs时,grep版本号是必须要包含在内的。
26. -v, --invert-match
显示除搜寻样式行之外的全部。
27. -w, --word-regexp
将搜寻样式视为一个字去搜寻,完全符合该"字"的行才会被列出。
28. -x, --line-regexp
将搜寻样式视为一行去搜寻,完全符合该"行"的行才会被列出。
2008年11月11日星期二
UNIX命令-后台运行命令
后台运行某个命令
后台运行某个命令或SHELL,如
find / -type f -name "crontab" 2> temp | xagrs ll &
若-type d 则会列出crontab文件夹内的文件
若要在服务器上一直运行某个命令或SHELL,则形式为 nohup a.sh &
Linux系统下运行命令时CTRL+Z的作用
命令运行时使用CTRL+Z,强制当前进程转为后台,并使之停止。
1. 使进程恢复运行(后台)
(1)使用命令bg
Example:
zuii@zuii-desktop:~/unp/tcpcliserv$ ./tcpserv01
*这里使用CTRL+Z,此时serv01是停止状态*
[1]+ Stopped ./tcpserv01
zuii@zuii-desktop:~/unp/tcpcliserv$ bg
[1]+ ./tcpserv01 & *此时serv01运行在后台*
zuii@zuii-desktop:~/unp/tcpcliserv$
(2)如果用CTRL+Z停止了几个程序呢?
Example:
zuii@zuii-desktop:~/unp/tcpcliserv$ jobs
[1]- Running ./tcpserv01 &
[2]+ Stopped ./tcpcli01 127.0.0.1
zuii@zuii-desktop:~/unp/tcpcliserv$ bg %1
bash: bg:任务 1 已转入后台 *后台运行*
2. 使进程恢复至前台运行
Example:
zuii@zuii-desktop:~/unp/tcpcliserv$ ./tcpserv04
[1]+ Stopped ./tcpserv04
zuii@zuii-desktop:~/unp/tcpcliserv$ fg
。/tcpserv04
总结:
(1) CTRL+Z停止进程并放入后台
(2) jobs 显示当前暂停的进程
(3) bg %N 使第N个任务在后台运行(%前有空格)
(4) fg %N 使第N个任务在前台运行
默认bg,fg不带%N时表示对最后一个进程操作!
df 命令 linux磁盘管理命令
功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
语法:df [选项]
说明:df命令可显示所有文件系统对i节点和磁盘块的使用情况。
该命令各个选项的含义如下:
-a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。
-k 以k字节为单位显示。
-i 显示i节点信息,而不是磁盘块。
-t 显示各指定类型的文件系统的磁盘空间使用情况。
-x 列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。
-T 显示文件系统类型。
例1:列出各文件系统的磁盘空间使用情况。
$ df
Filesystem 1 K-blocks Used Available Use% Mounted on
/dev/hda2 1361587 1246406 44823 97% /
df命令的输出清单的第1列是代表文件系统对应的设备文件的路径名(一般是硬盘上的分区);第2列给出分区包含的数据块(1024字节)的数目;第3,4
列分别表示已用的和可用的数据块数目。用户也许会感到奇怪的是,第3,4列块数之和不等于第2列中的块数。这是因为缺省的每个分区都留了少量空间供
系统管理员使用。即使遇到普通用户空间已满的情况,管理员仍能登录和留有解决问题所需的工作空间。清单中Use% 列表示普通用户空间使用的百分比,
即使这一数字达到100%,分区仍然留有系统管理员使用的空间。最后,Mounted on列表示文件系统的安装点。
例2:列出各文件系统的i节点使用情况。
$ df -ia
Filesystem Inodes IUsed IFree Iused% Mounted on
/dev/ hda2 352256 75043 277213 21% /
none 0 0 0 0% /proc
localhost:(pid221) 0 0 0 0% /net
例3:列出文件系统的类型。
$ df -T
Filesystem Type 1K-blocks Used Available use% Mounted on
/dev/hda2 ext2 1361587 1246405 44824 97% /
本例中的文件系统是ext2类型的。
nohup命令详解
Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
但是加入我们很多程序并不象mysqld一样做成守护进程,可能我们的程序只是普通程序而已,一般这种程序使用 & 结尾,但是如果终端关闭,那么程序也
会被关闭。但是为了能够后台运行,那么我们就可以使用nohup这个命令,比如我们有个test.php需要在后台运行,并且希望在后台能够定期运行,那么就
使用nohup:
nohup /root/test.php &
提示:
[~]$ appending output to nohup.out
嗯,证明运行成功,同时把程序运行的输出信息放到当前目录的 nohup.out 文件中去。
附:nohup命令参考
nohup 命令
用途:不挂断地运行命令。
语法:nohup Command [ Arg ... ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中
的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定
向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指
定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
退出状态:该命令返回下列出口值:
126 可以查找但不能调用 Command 参数指定的命令。
127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。
否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
nohup命令及其输出文件
nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之
后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。
该命令的一般形式为:nohup command &
使用nohup命令提交作业
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 &
在上面的例子中,输出被重定向到myout.file文件中。
使用 jobs 查看任务。
使用 fg %n 关闭。
另外有两个常用的ftp工具ncftpget和ncftpput,可以实现后台的ftp上传和下载,这样我就可以利用这些命令在后台上传和下载文件了。
bg 命令
如果指定的作业已经在后台运行,bg 命令不起作用并成功退出。
如果未提供 JobID 参数,bg 命令会使用最近暂挂的作业。
使用 bg 命令将作业放入后台,使该作业的进程标识在当前 shell 环境中被知晓。
bg 命令输出显示作业号和与该作业相关的命令。作业号可与 wait、fg
和 kill 命令一起使用,
只要在作业号前加上 %(百分号)前缀。例如:kill %3。
使用 Ctrl-Z 按键顺序就可以暂挂作业。使用 bg 命令就可在后台重新启动该作业。
当作业无需终端输入且作业输出被重定向至非终端文件时,这么做是有效的。
如果后台作业具有终端输出,可输入以下命令强制停止该作业:
stty tostop
输入以下命令可停止后台作业:
kill -s stop JobID
/usr/bin/bg 命令在自己的命令执行环境中操作时无效,因为该环境没有可处理的暂挂作业。如同以下示例所示:
Command | xargs bg
每个 /usr/bin/bg 命令在不同环境中运行并且无法共享父 shell 的作业理解。
由于此原因,bg 命令作为 Korn Shell 或 POSIX shell(经常是内置的)实行。
tail 命令
从指定点开始将文件写到标准输出。
语法
标准语法
tail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [ File ]
要以逆序显示行
tail [ -r ] [ -n Number ] [ File ]
描述
tail 命令从指定点开始将 File 参数指定的文件写到标准输出。如果没有指定文件,则会使用标准输入。 Number 变量指定将多少单元写入标准输出。
Number 变量的值可以是正的或负的整数。如果值的前面有 +(加号),从文件开头指定的单元数开始将文件写到标准输出。如果值的前面有 -(减号),
则从文件末尾指定的单元数开始将文件写到标准输出。如果值前面没有 +(加号)或 -(减号),那么从文件末尾指定的单元号开始读取文件。
Number 变量用于确定计数的起点的单元类型由 -b、-c、-k、-m 以及 -n 标志确定。如果没有指定其中的任何一个标志,那么 tail 命令就会读取指定文
件的最后十行,并将其写到标准输出。这与在命令行输入 -n 10 是相同的。
-m 标志在单字节和双字节字符环境中提供了一致的结果。当输入是包含多字节字符的文本文件时应谨慎使用 -c 标志,因为产生的输出可能不从字符边界
开始。
标志
-b Number 从 Number 变量表示的 512 字节块位置开始读取指定文件。
-c Number 从 Number 变量表示的字节位置开始读取指定文件。
-f 如果输入文件是常规文件或如果 File 参数指定 FIFO(先进先出),那么 tail 命令不会在复制了输入文件的最后的指定单元后终止,而是继续
从输入文件读取和复制额外的单元(当这些单元可用时)。如果没有指定 File 参数,并且标准输入是管道,则会忽略 -f 标志。tail -f 命令可用于监
视另一个进程正在写入的文件的增长。
-k Number 从 Number 变量表示的 1KB 块位置开始读取指定文件。
-m Number 从 Number 变量表示的多字节字符位置开始读取指定文件。使用该标志提供在单字节和双字节字符代码集环境中的一致结果。
-n Number 从 Number 变量表示的行位置开始读取指定文件。
-r 从文件末尾以逆序方式显示输出。-r 标志的缺省值是以逆序方式打印整个文件。如果文件大于 20,480 字节,那么 -r 标志只显示最后的
20,480 字节。
-r 标志只有与 -n 标志一起时才有效。否则,就会将其忽略。
退出状态
该命令返回下列的退出值:
0 成功完成。
>0 出现错误。
示例
1. 要显示 notes 文件的最后十行,输入:
tail notes
2. 要指定从 notes 文件末尾开始读取的行数,输入:
tail -n 20 notes
3. 要从第 200 字节开始,每次显示一页 notes 文件,输入:
tail -c +200 notes | pg
4. 要跟踪文件的增长,输入:
tail -f accounts
这显示 accounts 文件的最后十行。tail 命令继续显示添加到 accounts 文件中的行。显示会一直继续,直到您按下 Ctrl-C 按键顺序来停止。
文件
/usr/bin/tail 包含 tail 命令。
linux rm命令详解
。对于链接文件,只是断开了链接,原文件保持不变。\r
rm命令的一般形式为:\r
rm [选项] 文件…
如果没有使用- r选项,则rm不会删除目录。
该命令的各选项含义如下:\r
- f 忽略不存在的文件,从不给出提示。
- r 指示rm将参数中列出的全部目录和子目录均递归地删除。\r
- i 进行交互式删除。
使用rm命令要小心。因为一旦文件被删除,它是不能被恢复的。了防止这种情况的发生,可以使用i选项来逐个确认要删除的文件。如果用户输入y,文件
将被删除。如果输入任何其他东西,文件则不会删除。
linux下常用的关机/重启命令shutdown、halt、reboot、init
本文的介绍,希望你可以更加灵活的运用各种关机命令。
1. shutdown
shutdown命令安全地将系统关机。 有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的。因为linux与windows不同,其后台运行着许多进
程,所以强制关机可能会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。而在系统关机前使用shutdown命令﹐系统
管理员会通知所有登录的用户系统将要关闭。并且login指令会被冻结﹐即新的用户不能再登录。直接关机或者延迟一定的时间才关机都是可能的﹐还可能
重启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal决定的。这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件
〔mail〕和新闻〔news〕的程序则可以正常地离开等等。
shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevel。Runlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕
系统﹐而runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也没有-r参数给shutdown。要想了解在停机〔halt〕或者
重新开机〔reboot〕过程中做了哪些动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。
shutdown 参数说明:
[-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。
[-r] 重启计算器。
[-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。
[-h] 关机后关闭电源〔halt〕。
[-n] 不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后果往往不总是你所预期得到的。
[-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会
送到每位使用者。
[-f] 在重启计算器〔reboot〕时忽略fsck。
[-F] 在重启计算器〔reboot〕时强迫fsck。
[-time] 设定关机〔shutdown〕前的时间。
2.halt----最简单的关机命令
其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。
参数说明:
[-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。
[-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。
[-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
[-f] 没有调用shutdown而强制关机或重启。
[-i] 关机〔或重启〕前﹐关掉所有的网络接口。
[-p] 该选项为缺省选项。就是关机时调用poweroff。
3.reboot
reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是关机。它的参数与halt相差不多。
4.init
init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的用户进程﹑守护进程等。shutdown 就是使用这种机制。init定义了8
个运行级别(runlevel),init 0为关机﹐init 1为重启。关于init可以长篇大论﹐这里就不再叙述。另外还有telinit命令可以改变init的运行级别﹐比如
﹐telinit -iS可使系统进入单用户模式﹐并且得不到使用shutdown时的信息和等待时间。
linux下man命令详解
man -f man 显示man程序的所有文档
在man中查询
apropos keywords
man -k keywords
重建man库
makewhatis
查询man文档位置
whereis man 查询man的文档位置
查看当前man的文档目录
manpath
打印man文档
man -t finger | lpr 打印
lpstat -p -d 查看打印机状态
用浏览器打开
man -Hfirefox bash
将man的结果保存在文件内
man bash | col -b > bash.txt
col是用来对文本进行转换的命令,这里是去掉所有的退格符号
名称
man-显示线上求助手册(manualpage)manpath-决定线上手册的搜寻路径
摘要
man[-acdfhkKtwW][-msystem][-pstring][-Cconfig_file][-Mpath][-Ppager][-Ssection_list][section]name...
描述
man 是用来排版并显示线上求助手册,此版本了解MANPATH与(MAN)PAGER这两个环境变数,所以你可以拥有个人的线上手册,并选择任何程式来显示已排版的
手册。如果指定了section,则man只会显示该手册的特定章节。您也可以利用选项或是环境变数来指定搜寻的次序或是排版之前的处理工具。如果 name包
含了`/'则man会先搜寻所指定的档案,所以您可以man./foo.5或者是man/cd/foo/bar.1.gz。
选项
-Cconfig_file指定设定档man.conf;内定值是/etc/man.conf。(Seeman.conf(5).)
-M
path指定了线上手册的搜寻路径,如果没有指定则使用环境变数MANPATH的设定;如果没有使用MANPATH,则会使用/usr/lib/man.conf内的设定;如果MANPATH
是空字串则表示使用内定值。
-P
pager指定使用何种pager.man会优先使用此选项设定,然后是依环境变数MANPAGER设定,然后是环境变数PAGER;man内定使用/usr/bin/less-is。
-S
section_listman所搜寻的章节列表(以冒号分隔),此选项会覆盖环境变数MANSECT的设定。
-a
man内定在显示第一个找到的手册之后就会停止搜寻,使用此选项会强迫man显示所有符合name的线上手册。
-c
即使有最新的catpage,还是对线上手册重新作排版,本选项在萤幕的行列数改变时或已排版的线上手册损坏时特别有意义。
-d
不要真的显示线上手册,只显示除错讯息。
-D
同时显示线上手册与除错讯息。
-f
功能同whatis。
-h
显示求助讯息然后结束程式。
-k
功能同apropos。
-K
对所有的线上手册搜寻所指定的字串。警告:本功能回应速度可能很慢!如果指定section会对速度有帮助。
-m
system依所指定的system名称而指定另一组的线上手册。
-p
string 指定在nroff或troff之前所执行的处理程式不是所有的安装都会有完整的前处理器。各个前处理器所代表的字母分别为:eqn(e),grap(g),pic
(p),tbl(t),vgrind(v),refer(r).本选项覆盖环境变数MANROFFSEQ的设定。
-t
使用/usr/bin/groff-Tps-mandoc来对线上手册排版,并将结果显示至stdout。/usr/bin/groff-Tps-mandoc的输出结果可能还需要特定的过滤器才能列印(
如bg5ps)。
-w或--path
不要真的显示线上手册,但显示线上手册的位置.如果没有指定引数则显示man所搜寻的目录列表。如果manpath是man的□结,则玬anpath?功能同玬an--
path?。
-W
功能类-w,但每行只印出一个档名,不印出额外的讯息.这在下面的状况特别有用:man-aWman|xargsls-l。
man会试着存下已排版的线上手册,以节省下回排版所需要的时间。传统上,位于DIR/X的手册在排版完成后会存于DIR/catX,但在这里是存
于/var/ctaman/catX。如果系统没有所需要的目录,则不会有任何catpage存档。
Itispossibletomakemansuidtoauserman.Then,ifacatdirectoryhasownermanandmode0755
(onlywritablebyman),andthecatfileshaveownermanandmode0644or0444
(onlywritablebyman,ornotwritableatall),noordinaryusercanchangethecatpagesorputotherfilesinthecatdirectory.Ifmanisnotmadesuid,thenacatdi
rectoryshouldhavemode0777ifallusersshouldbeabletoleavecatpagesthere.
选项-c强迫对线上手册重新作排版。
环境变数
MANPATHMANPATH用来设定man的搜寻路径。
MANROFFSEQ
MANROFFSEQ用来设定在nroff或troff执行前所需要的前处理器。内定在nroff前会先执行tablepreprocessor。
MANSECT
MANSECT决定man搜寻的章节。
MANWIDTH
MANWIDTH用来设定显示的宽度。若无设定,则手册会填满您萤幕的宽度。
MANPAGER
MANPAGER决定了显示线上手册的工具。如果无MANPAGER则使用PAGER,如果两者皆未设定则使用/usr/bin/less-is。
LANGLANG决定了man先搜寻的的子目录的名称所以`LANG=dkman1foo'会使man先搜寻[path]/dk/man1/foo.1,如果找不到该档,man才去寻找
[path]/man1/foo.1,[path]是指预设的搜寻路径。
NLSPATH,LC_MESSAGES,LANG
环境变数NLSPATH与LC_MESSAGES(如果LC_MESSAGE不存在则使用LANG)用来指定讯息的语言种类.(英文讯息是编译时即内定,故不需另外设定.)请注意,man所
呼叫的程式,如col(1)也会使用这些环境变数。
PATHPATH是用来设定man的搜寻线上手册的路径。
SYSTEMSYSTEM用来设定替代的系统名(此为选项-m所使用)。
相关说明
apropos(1),whatis(1),less(1),groff(1)。
rm unix命令
除去(解链)文件或目录。
语法
rm [ -f ] [ -r ] [ -R ] [ -i ] [ -e ] File ...
描述
rm 命令从目录中除去指定的 File 参数的项。如果项为到文件的最后链接,则删除这个文件。如果没有对文件的写许可权且标准输入为终端,提示输入文
件名并询问以确认你想要删除该文件。如果输入 y(即“是”)则删除文件,输入另外的字符则不删除文件。不需要对你想要除去的文件的读或写许可权
。然而,对于包含文件的目录你必须有写许可权。
如果文件是符号链接,则除去链接,但是符号链路引用的文件或目录仍在。如果您有目录的写许可权,则不需要文件的写许可权就能删除符号链路。
如果任一文件(. 点)或 ..(点,点)被指定为 File 参数的基本名部分,rm 命令写诊断信息到标准错误且不再对此类参数执行任何操作。
如果没有指定 -f 标志、且要么 File 参数没有写许可权、标准输入为工作站,要么指定了 -i 标志,rm 命令写提示到标准错误并从标准输入读取一行。
如果没有确认响应,rm 命令不再对当前文件做任何操作并继续处理下一个文件。
如果设置了目录粘滞位而目录不为用户所有,其它用户所有的文件不能被除去。
注: rm 命令支持 -- (破折号,破折号) 参数作为表示标志结束的定界符。
标志
-e 在每一个文件被删除后显示消息。
-f 在除去有写保护的文件前不提示。如果指定的文件不存在,不显示错误消息或返回错误状态。如果 -f 和 -i 标志都被指定,最后指定的标志起
作用。
-i 删除每个文件前提示。但一起使用 -i 和 -r 标志时,rm 命令在删除目录前也提示。如果 -i 和 -f 标志都被指定,最后指定的标志起作用。
-r 当 File 参数为目录时允许循环的删除目录及其内容。本标志等同于 -R 标志。
-R 当 File 参数为目录时允许循环的删除目录及其内容。本标志等同于 -r 标志。
退出状态
命令返回下列出口值:
0 如果没有指定 -f 标志,除去所有指定的目录项;否则,除去所有现有的指定目录项。
>0 有错误发生。
示例
1. 删除文件,输入:
rm myfile
如果有到此文件的别的链接,则文件仍在那个名称下,但是除去了名称 myfile。如果 myfile 是其仅有的链接,则删除文件本身。
2. 要不先接收确认提示而删除文件,输入:
rm -f core
在 rm -f 命令试图除去名为 core 的文件前不发送确认提示。然而,如果 core 文件为写保护并且你不是文件的所有者或你没有 root 权限,显示
错误消息。当 rm -f 命令试图除去不存在的文件时不显示错误消息。
3. 要一个一个的删除文件,输入:
rm -i mydir/*
显示每个文件名后,输入 y 来删除文件,或按下 Enter 键来保留它。
4. 要删除目录树,输入:
rm -ir manual
本命令循环地除去 manual 目录的所有子目录的内容,提示注意每一个文件的除去,然后除去 manual 目录本身,例如:
你: rm -ir manual
系统: rm: Select files in directory manual? Enter y for yes.
你: y
系统: rm: Select files in directory manual/draft1? Enter y for yes.
你: y
系统: rm: Remove manual/draft1?
你: y
系统: rm: Remove manual/draft1/chapter1?
你: y
系统: rm: Remove manual/draft1/chapter2?
你: y
系统: rm: Select files in directory manual/draft2? Enter y for yes.
你: y
系统: rm: Remove manual/draft2?
你: y
系统: rm: Remove manual?
你: y
这里,rm 命令首先询问你是否要搜索manual 目录。由于 manual 目录包含目录,rm 命令接着询问是否允许为删除文件搜索 manual/draft1 中的
文件,然后询问是否想要删除 manual/draft1/chapter1 和 manual/draft1/chapter2 文件。rm 命令接着询问是否允许搜索manual/draft2 目录。然后询
问是否允许删除manual/draft1、manual/draft2和 manual 目录。
如果拒绝许可除去子目录(例如,manual/draft2),rm 命令不除去 manual 目录。那样,你将看见消息:rm: 目录 manual 未清空。
文件
/usr/bin/rm 包含 rm 命令。
Linux系统利用Crontab命令实现定时重启
使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它,
cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除没个用户的cron服务
crontab -e //编辑某个用户的cron服务
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
编辑/etc/crontab文件,在末尾加上一行: 30 5 * * * root init 6 这样就将系统配置为了每天早上5点30自动重新启动。
需要将crond设置为系统启动后自动启动的服务,可以在/etc/rc.d/rc.local 中,在末尾加上
service crond start
如果还需要在系统启动十加载其他服务,可以继续加上其他服务的启动命令。
比如: service mysqld start
基本用法:
1. crontab -l
列出当前的crontab任务
2. crontab -d
删除当前的crontab任务
3. crontab -e (solaris5.8上面是 crontab -r)
编辑一个crontab任务,ctrl_D结束
4. crontab filename
以filename做为crontab的任务列表文件并载入
crontab file的格式:
crontab 文件中的行由 6 个字段组成,不同字段间用空格或 tab 键分隔。前 5 个字段指定命令要运行的时间
分钟 (0-59)
小时 (0-23)
日期 (1-31)
月份 (1-12)
星期几(0-6,其中 0 代表星期日)
第 6 个字段是一个要在适当时间执行的字符串
例子:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2 * * * date (solaris 5.8似乎不支持此种写法)
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份日早上4点
0 4 1 jan * date
补充:在使用crontab的时候,要特别注意的是运行脚本中能够访问到的环境变量和当前测试环境中的环境变量未必一致,一个比较保险的做法是在运
行的脚本程序中自行设置环境变量(export)
(1)先建一个文件crond.txt如下, 每天早上5点36分重新启动
36 5 * * * reboot
(2)上传到/opt目录
(3)运行命令
crontab /opt/crond.txt
crontab -l
让配置文件生效:如果让配置文件生效,还得重新启动cron,切记,既然每个用户下的cron配置文件修改后。也要重新启动cron服务器。
在Fedora 和Redhat中,我们应该用;
[root@localhost ~]# /etc/init.d/crond restart
如果让crond 在开机时运行,应该改变其运行级别;
[root@localhost ~]# chkconfig ——levels 35 crond on
service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它, cron服务是一个定时执行的服务,可以通过crontab 命
令添加或者编辑需要定时执行的任务
Crontab文件的每一行由六个域(minutes、hours、day of month、month、day of week、 command)组 成,域之间用空格或Tab分开,其中:
minutes: 分钟域,值的范围是0到59
hours: 小时域,值的范围是0到23
day of month: 日期,值的范围是1到31
month: 月份,值的范围是1到12
day of week: 星期,值的范围是0到6,星期日值为0
command: 所要运行的命令
如果一个域是*,表明命令可以在该域所有可能的取值范围内执行。
如果一个域是由连字符隔开的两个数字,表明命令可以在两个数字之间的范围内执行(包括两个数字 本身)。
如果一个域是由逗号隔开的一系列值组成的,表明命令可以在这些值组成的范围内执行。
如果日期域和星期域都有值,则这两个域都有效。
编写一个文件,用以启动自动备份进程。
cd /opt
touch reboot.txt
在reboot.txt中添加一下内容:
0 4 * * * reboot
crontab /opt/reboot.txt
用crontab -e编辑定时操作,例如加入下行命令:
用crontab -l命令来查看
注意:需要启动服务(添加在rc.local中)
重启crond任务
/etc/init.d/cron restart (ubuntu下)
第一种 在Fedora或Redhat 等以RPM包管理的系统中;
[root@localhost ~]# /etc/init.d/crond start
[root@localhost ~]# /etc/init.d/crond stop
[root@localhost ~]# /etc/init.d/crond restart
/etc/rc.d/init.d/crond restart
命令简介
crontab-操作每个用户的守护程序和该执行的时间表。
部分参数说明
crontab file [-u user]-用指定的文件替代目前的crontab.
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。
crontab文件的格式:M H D m d cmd.
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量。
下面是一个例子文件:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点
106* * * date
#每两个小时
0*/2* * * date
#晚上11点到早上8点之间每两个小时,早上部点
0 23-7/2,8* * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4* mon-wed date
#1月份日早上4点
0 4 1 jan* date
范例
lark:~>crontab-1 列出用户目前的crontab.
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
10 6* * * date
0*/2* * * date
0 23-7/2,8 * * * date
lark:~>