<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LinuxSense</title>
	<atom:link href="http://www.linuxsense.org/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linuxsense.org</link>
	<description>分享Linux技术的点点滴滴</description>
	<lastBuildDate>Sat, 01 Aug 2009 05:23:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>lsof 命令</title>
		<link>http://www.linuxsense.org/archives/9234.html</link>
		<comments>http://www.linuxsense.org/archives/9234.html#comments</comments>
		<pubDate>Fri, 03 Apr 2009 03:38:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux命令]]></category>
		<category><![CDATA[lsof]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9234</guid>
		<description><![CDATA[lsof命令详解：lsof命令的原始功能是列出打开的文件的进程，但LINUX下，所有的设备都是以文件的行式存在的，所以，lsof的功能很强大.一般root用户才能执行lsof命令，普通用户可以看见/usr/sbin/lsof命令，但是普通用户执行会显示“permission denied” sof指令的用法如下： lsof abc.txt 显示开启文件abc.txt的进程 lsof -i :22 知道22端口现在运行什么程序 lsof -c abc 显示abc进程现在打开的文件 lsof -g gid 显示归属gid的进程情况 lsof +d /usr/local/ 显示目录下被进程开启的文件 lsof +D /usr/local/ 同上，但是会搜索目录下的目录，时间较长 lsof -d 4 显示使用fd为4的进程 lsof -i 用以显示符合条件的进程情况 语法: lsof -i[46] [protocol][@hostname&#124;hostaddr][:service&#124;port] 46 &#8211;&#62; IPv4 or IPv6 protocol &#8211;&#62; TCP or UDP hostname &#8211;&#62; Internet host name hostaddr &#8211;&#62; IPv4位置 [...]]]></description>
			<content:encoded><![CDATA[<p>lsof命令详解：lsof命令的原始功能是列出打开的文件的进程，但LINUX下，所有的设备都是以文件的行式存在的，所以，lsof的功能很强大.一般root用户才能执行lsof命令，普通用户可以看见/usr/sbin/lsof命令，但是普通用户执行会显示“permission denied”</p>
<p>sof指令的用法如下：</p>
<p>lsof abc.txt 显示开启文件abc.txt的进程</p>
<p>lsof -i :22 知道22端口现在运行什么程序</p>
<p>lsof -c abc 显示abc进程现在打开的文件</p>
<p>lsof -g gid 显示归属gid的进程情况</p>
<p>lsof +d /usr/local/ 显示目录下被进程开启的文件</p>
<p>lsof +D /usr/local/ 同上，但是会搜索目录下的目录，时间较长</p>
<p>lsof -d 4 显示使用fd为4的进程</p>
<p><span id="more-9234"></span></p>
<p>lsof -i 用以显示符合条件的进程情况</p>
<p>语法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]</p>
<p>46 &#8211;&gt; IPv4 or IPv6</p>
<p>protocol &#8211;&gt; TCP or UDP</p>
<p>hostname &#8211;&gt; Internet host name</p>
<p>hostaddr &#8211;&gt; IPv4位置</p>
<p>service &#8211;&gt; /etc/service中的 service name (可以不只一个)</p>
<p>port &#8211;&gt; 端口号 (可以不只一个)</p>
<p>例子: TCP:25 &#8211; TCP and port 25</p>
<p>@1.2.3.4 &#8211; Internet IPv4 host address 1.2.3.4</p>
<p>tcp@ohaha.ks.edu.tw:ftp &#8211; TCP protocol hosthaha.ks.edu.tw service name:ftp</p>
<p>lsof -n 不将IP转换为hostname，缺省是不加上-n参数</p>
<p>例子: lsof -i tcp@ohaha.ks.edu.tw:ftp -n</p>
<p>lsof -p 12 看进程号为12的进程打开了哪些文件</p>
<p>lsof +|-r [t] 控制lsof不断重复执行，缺省是15s刷新</p>
<p>-r，lsof会永远不断的执行，直到收到中断信号</p>
<p>+r，lsof会一直执行，直到没有档案被显示</p>
<p>例子：不断查看目前ftp连接的情况：lsof -i tcp@ohaha.ks.edu.tw:ftp -r</p>
<p>lsof -s 列出打开文件的大小，如果没有大小，则留下空白</p>
<p>lsof -u username 以UID，列出打开的文件</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9234.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>fuser 命令</title>
		<link>http://www.linuxsense.org/archives/9232.html</link>
		<comments>http://www.linuxsense.org/archives/9232.html#comments</comments>
		<pubDate>Thu, 02 Apr 2009 07:11:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux命令]]></category>
		<category><![CDATA[fuser]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9232</guid>
		<description><![CDATA[用途 使用文件或文件结构识别进程。 语法 fuser [ -c &#124; -d &#124; -f ] [ -k ] [ -u ] [ -x ] [ -V ]文件 &#8230; 描述 此 fuser 命令列出了本地进程的进程号，那些本地进程使用File 参数指定的本地或远程文件。对于阻塞特别设备，此命令列出了使用该设备上任何文件的进程。 每个进程号后面都跟随一个字母，该字母指示进程如何使用文件。 c 将此文件作为当前目录使用。 e 将此文件作为程序的可执行对象使用。 r 将此文件作为根目录使用。 s 将此文件作为共享库（或其它可装载对象）使用。 进程号被写入标准输出（在进程号之间有空格的行中）。一个换行符被写入标准错误（在每个文件操作数的最后一个输出之后）。其他所有输出被写入标准错误。 此 fuser 命令不会检测有 mmap 区域的进程，其中相关的文件描述符已从此被关闭。 标志 -c 包含 File的文件系统中关于任何打开的文件的报告。 -d 暗示使用了 -c 和 -x 标志。关于任何与文件系统（自父目录删除的）无链接的打开文件的报告。当与 -V [...]]]></description>
			<content:encoded><![CDATA[<p><strong>用途</strong><br />
使用文件或文件结构识别进程。</p>
<p><strong>语法</strong><br />
fuser [ -c | -d | -f ] [ -k ] [ -u ] [ -x ] [ -V ]文件 &#8230;</p>
<p><strong>描述<br />
</strong>此 fuser 命令列出了本地进程的进程号，那些本地进程使用File 参数指定的本地或远程文件。对于阻塞特别设备，此命令列出了使用该设备上任何文件的进程。</p>
<p>每个进程号后面都跟随一个字母，该字母指示进程如何使用文件。</p>
<p>c 将此文件作为当前目录使用。<br />
e 将此文件作为程序的可执行对象使用。<br />
r 将此文件作为根目录使用。<br />
s 将此文件作为共享库（或其它可装载对象）使用。</p>
<p><span id="more-9232"></span></p>
<p>进程号被写入标准输出（在进程号之间有空格的行中）。一个换行符被写入标准错误（在每个文件操作数的最后一个输出之后）。其他所有输出被写入标准错误。</p>
<p>此 fuser 命令不会检测有 mmap 区域的进程，其中相关的文件描述符已从此被关闭。</p>
<p><strong>标志</strong></p>
<p>-c 包含 File的文件系统中关于任何打开的文件的报告。<br />
-d 暗示使用了 -c 和 -x 标志。关于任何与文件系统（自父目录删除的）无链接的打开文件的报告。当与 -V 标志一起使用时，它也会报告被删除文件的节点号和大小。<br />
-f 仅对文件的打开实例报告。<br />
-k 将 SIGKILL 信号发送到每个本地进程。仅有 root 用户能终止另一用户的进程。<br />
-u 为进程号后圆括号中的本地进程提供登录名。<br />
-V 提供详细输出。<br />
-x 与 -c 或 -f 连用，报告除标准 fuser 输出以外的可执行的和可载入的对象。</p>
<p><strong>示例</strong><br />
要列出使用 /etc/passwd 文件的本地进程的进程号，请输入：</p>
<p>fuser /etc/passwd要列出使用 /etc/filesystems 文件的进程的进程号和用户登录名，请输入：</p>
<p>fuser -u /etc/filesystems要终止使用给定文件系统的所有进程，请输入：</p>
<p>fuser -k -x -u -c /dev/hd1 或者</p>
<p>fuser -kxuc /home任一命令都列出了进程号和用户名，然后终止每个正在使用 /dev/hd1 (/home) 文件系统的进程。仅有 root 用户能终止属于另一用户的进程。如果您正在试图卸下 /dev/hd1 文件系统，而一个正在访问 /dev/hd1 文件系统的进程不允许这样，您可能希望使用此命令。</p>
<p>要列出正在使用已从给定文件系统删除的文件的全部进程，请输入：</p>
<p>fuser -d /usr文件</p>
<p>/dev/kmem 用于系统映像。<br />
/dev/mem 也用于系统映像。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9232.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>pkill和pgrep命令详解</title>
		<link>http://www.linuxsense.org/archives/9230.html</link>
		<comments>http://www.linuxsense.org/archives/9230.html#comments</comments>
		<pubDate>Thu, 02 Apr 2009 05:51:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux命令]]></category>
		<category><![CDATA[pgrep]]></category>
		<category><![CDATA[pkill]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9230</guid>
		<description><![CDATA[名称 pgrep, pkill – 查找或者发信号给进程通过名称和其它属性。 语法 pgrep [-flvx] [-n &#124; -o] [-d delim] [-P ppidlist] [-g pgrplist] [-s sidlist] [-u euidlist] [-U uidlist] [-G gidlist] [-J projidlist] [-t termlist] [-T taskidlist] [-c ctidlist] [-z zoneidlist] [pattern] pkill [-signal] [-fvx] [-n &#124; -o] [-P ppidlist] [-g pgrplist] [-s sidlist] [-u euidlist] [-U uidlist] [-G gidlist] [-J [...]]]></description>
			<content:encoded><![CDATA[<p><strong>名称</strong><br />
pgrep, pkill – 查找或者发信号给进程通过名称和其它属性。</p>
<p><strong>语法<br />
</strong>pgrep [-flvx] [-n | -o] [-d delim] [-P ppidlist] [-g pgrplist] [-s sidlist] [-u euidlist] [-U uidlist] [-G gidlist] [-J projidlist] [-t termlist] [-T taskidlist] [-c ctidlist] [-z zoneidlist] [pattern]</p>
<p>pkill [-signal] [-fvx] [-n | -o] [-P ppidlist] [-g pgrplist] [-s sidlist] [-u euidlist] [-U uidlist] [-G gidlist] [-J projidlist] [-t termlist] [-T taskidlist] [-c ctidlist] [-z zoneidlist] [pattern]</p>
<p><span id="more-9230"></span></p>
<p><strong>说明</strong><br />
　　pgrep程序检查在系统的中活动进程，报告进程属性匹配命令行上指定条件的进程的ID。每一个进程ID以一个十进制数表示，通过一个分割字符串和下一个ID分开，默认的分割字符串是一个新行。对于每个属性选项，用户可以在命令行上指定一个以逗号分割的可能值的集合。例如，<br />
　　pgrep -G other,daemon<br />
　　匹配真实组ID是other或者是daemon的进程。如果多个条件被指派，这些匹配条件按逻辑与&#8221;AND&#8221;规则运算。例如，<br />
　　pgrep -G other,daemon -U root,daemon<br />
　　匹配进程它的属性是：<br />
　　(真实的组ID是other或者是daemon) 与 (真实的用户ID是root或者是daemon)<br />
　　pkill函数和pgrep相同，除了匹配的进程被信号通知就像用kill(1)替代了pgrep的进程ID的输出。一个信号名称或者数字可以作为pkill的第一个命令行选项。</p>
<p><strong>选项</strong><br />
　　支持下面的选项：The following options are supported:<br />
　　-c ctidlist　仅匹配列表中列出的ID的进程。<br />
　　-d delim　指定每一个匹配的进程ID之间分割字符串。如果没有 -d 选项指定，默认的是新行字符。-d 选项仅在pgrep命令中有效。<br />
　　-f正则表达式模式将执行与完全进程参数字符串 (从/proc/nnnnn/psinfo文件的pr_psargs字段获得)匹配。如果没有 -f 选项，表达式仅对执行文件名称(从/proc/nnnnn/psinfo文件pr_fname字段获得)匹配。<br />
　　-g pgrplist仅匹配进程组ID在给定列表中的进程。如果组0包括在列表中，这个被解释为pgrep或者pkill进程的组ID。<br />
　　-G gidlist仅匹配真实组ID在给定列表中的进程。每一个组ID可以使用组名称或者数字的组ID指定。<br />
　　-J projidlist匹配项目ID在给定列表中的进程。每一个项目ID可以使用项目的名称或者数字项目ID来指定。<br />
　　-l长格式输出。输出每一个匹配进程的名称连同进程ID。进程名称从pr_psargs 或者 pr_fname字段获得，依赖于-f选项是否指定。-l选项仅在pgrep命令中有效。<br />
　　-n匹配最新（最近生成的）符合所有其它匹配条件的进程。不能和-o选项一起使用。<br />
　　-o匹配最旧（最早生成的）符合所有其它匹配条件的进程。不能和-n选项一起使用。<br />
　　-P ppidlist 仅匹配给定列表中父进程ID的进程。<br />
　　-s sidlist 仅匹配进程会话ID在给定列表中的进程。如果ID 0在列表中，这个解释为pgrep或者pikill进程的会话ID。<br />
　　-t termlist　仅匹配与给定列表中终端关联的进程。每一个终端指定为在/dev中终端设备路径名称的后缀。例如term/a 或者 pts/0。<br />
　　-T taskidlist 仅匹配在给定列表中任务ID的进程。如果ID 0包括在列表中，这个解释为pgrep或者pikill进程的会话ID。<br />
　　-u euidlist 仅匹配有效用户ID在给定列表中的进程。每个用户ID可以通过一个登录名称或者数字的用户ID指定。<br />
　　-U uidlist 仅匹配真实的用户ID在给定列表中的进程。每个用户ID可以通过一个登录名称或者数字的用户ID指定。<br />
　　-v 反向匹配。匹配所有的进程除了符合匹配条件的。<br />
　　-x 仅认为进程其参数字符串或者执行文件名称正确匹配规定模式是匹配的进程。模式被认为是准确的当所有在进程参数字符串或者可执行文件名称的字符匹配模式。<br />
　　-z zoneidlist 仅匹配区域ID在给定列表中的进程。每一个区域ID可以使用一个区域名称或者一个数字的区域ID指定。这个选项仅在全局区域中执行有效。如果pkill程序用来往其它区域的进程发信号，进城必须宣称{PRIV_PROC_ZONE}特权。<br />
　　-signal 指定发往每一个匹配进程的信号。如果没有指定，SIGTERM 是默认的信号。-signal仅在pkill命令中作为第一个选项有效。信号可以是在signal.h中定义的没有SIG前缀的一个符号名字，也可是一个相应的信号数值。</p>
<p><strong>操作</strong></p>
<p>支持如下操作:<br />
pattern<br />
　　　　指定一个扩展正则表达式(Extended Regular Expression (ERE))模式来匹配可执行文件名称或者完整的进程参数字符串。ERE语法的完整描述参看regex(5)。</p>
<p>例子</p>
<p>例子1 获得一个进程ID</p>
<p>获得sendmail的进程ID:</p>
<p>example% pgrep -x -u root sendmail<br />
283</p>
<p>例子2 终止一个进程</p>
<p>终止最近生成的xterm:</p>
<p>example% pkill -n xterm</p>
<p>Exit Status</p>
<p>　　如下退出值被返回：</p>
<p>　　0　一个或者多个进程被匹配。<br />
　　1　没有进程被匹配。<br />
　　2　指定了无效的命令行参数。<br />
　　3　出现一个致命的错误。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9230.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>man hier中文</title>
		<link>http://www.linuxsense.org/archives/9227.html</link>
		<comments>http://www.linuxsense.org/archives/9227.html#comments</comments>
		<pubDate>Thu, 26 Mar 2009 01:13:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux命令]]></category>
		<category><![CDATA[hier]]></category>
		<category><![CDATA[man hier]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9227</guid>
		<description><![CDATA[NAME 名称 hier &#8211; 文件系统描述 DESCRIPTION 描述 一个典型的Linux系统具有以下几个目录结构： / 根目录，是所有目录树开始的地方。 /bin 此目录下包括了单用户方式及系统启动或修复所用到的所有执行程序。 /boot 包括了引导程序的静态文件。此目录下包括了在引导过程中所必需的文件。系统装载程序及配制文件在 /sbin 和 /etc 目录中找到。 /dev 对应物理设备的指定文件或驱动程序。参见mknod(1)。 /dos 如果MS-DOS和Linux共存于一台计算机时，这里通常用于存放DOS 文件系统。 /etc 用于存放本地机的配置文件。一些大型套件，如X11，在 /etc 下有它们自己的子目录。系统配置文件可以放在这里或在 /usr/etc。 不过所有程序总是在 /etc 目录下查找所需的配置文件，你也可以将这些文件链接到目录 /usr/etc. /etc/skel 当建立一个新用户账号时，此目录下的文件通常被复制到用户的主目录下。 /etc/X11 X11 window system所需的配置文件。 /home 在Linux机器上，用户主目录通常直接或间接地置在此目录下。其结构通常由本地机的管理员来决定。 /lib 此目录下包含系统引导和在根用户执行命令所必需用到的共享库。 /mnt 挂载临时文件系统的挂载点。 /proc 这是提供运行过程和核心文件系统 proc 挂载点。这一&#8221;伪&#8221;文件系统在以下章节中有详细叙述 proc(5)。 /sbin 类似于 /bin 此目录保存了系统引导所需的命令，但这些命令一般使用者不能执行。 /tmp 此目录用于保存临时文件，临时文件在日常维护或在系统启动时无需通知便可删除 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>NAME 名称</strong><br />
hier &#8211; 文件系统描述</p>
<p><strong>DESCRIPTION 描述</strong><br />
一个典型的Linux系统具有以下几个目录结构：<br />
<em>/ 根目录，是所有目录树开始的地方。<br />
/bin 此目录下包括了单用户方式及系统启动或修复所用到的所有执行程序。<br />
/boot 包括了引导程序的静态文件。此目录下包括了在引导过程中所必需的文件。系统装载程序及配制文件在 /sbin 和 /etc 目录中找到。<br />
/dev 对应物理设备的指定文件或驱动程序。参见mknod(1)。<br />
/dos 如果MS-DOS和Linux共存于一台计算机时，这里通常用于存放DOS 文件系统。<br />
/etc 用于存放本地机的配置文件。一些大型套件，如X11，在 /etc 下有它们自己的子目录。系统配置文件可以放在这里或在 /usr/etc。 不过所有程序总是在 /etc 目录下查找所需的配置文件，你也可以将这些文件链接到目录 /usr/etc.<br />
/etc/skel</em></p>
<p><span id="more-9227"></span><br />
<em><br />
当建立一个新用户账号时，此目录下的文件通常被复制到用户的主目录下。<br />
/etc/X11<br />
X11 window system所需的配置文件。<br />
/home<br />
在Linux机器上，用户主目录通常直接或间接地置在此目录下。其结构通常由本地机的管理员来决定。<br />
/lib<br />
此目录下包含系统引导和在根用户执行命令所必需用到的共享库。<br />
/mnt<br />
挂载临时文件系统的挂载点。<br />
/proc<br />
这是提供运行过程和核心文件系统 proc 挂载点。这一&#8221;伪&#8221;文件系统在以下章节中有详细叙述 proc(5)。<br />
/sbin<br />
类似于 /bin 此目录保存了系统引导所需的命令，但这些命令一般使用者不能执行。<br />
/tmp<br />
此目录用于保存临时文件，临时文件在日常维护或在系统启动时无需通知便可删除<br />
/usr<br />
此目录通常用于从一个独立的分区上挂载文件。它应保存共享只读类文件，这样它可以被运行Linux的不同主机挂载。<br />
/usr/X11R6<br />
X-Window系统 Version 11 release 6.<br />
/usr/X11R6/bin<br />
X-Windows系统使用的二进制文件；通常是在对更传统的 /usr/bin/X11 中文件的符号连接。<br />
/usr/X11R6/lib<br />
保存与X-Windows系统有关数据文件。<br />
/usr/X11R6/lib/X11<br />
此目录保存与运行X-Windows系统有关其他文件。通常是对来自 /usr/lib/X11 中文件的符号连接。<br />
/usr/X11R6/include/X11<br />
此目录保存包括使用X11窗口系统进行编译程序所需的文件。通常是对来自 /usr/lib/X11 中文件的符号连接。<br />
/usr/bin<br />
这是执行程序的主要目录，其中的绝大多数为一般使用者使用，除了那些启动系统或修复系统或不是本地安装的程序一般都放在此目录下。<br />
/usr/bin/X11<br />
X11执行文件放置的地方；在Linux系统中，它通常是对 /usr/X11R6/bin. 符号连接表<br />
/usr/dict<br />
此目录保存拼写检查器所使用的词汇表文件。<br />
/usr/doc<br />
此目录下应可以找到那些已安装的软件文件。<br />
/usr/etc<br />
此目录可用来那些存放整个网共享的配置文件。然而那可执行命令指向总是使用参照使用 /etc 目录下的文件。 /etc 目录下连接文件应指向 /usr/etc. 目录下适当的文件。<br />
/usr/include<br />
C程序语言编译使用的Include&#8221;包括&#8221;文件。<br />
/usr/include/X11<br />
C程序语言编译和X-Windows系统使用的 Include&#8221;包括&#8221;文件。它通常中指向 /usr/X11R6/include/X11. 符号连接表。<br />
/usr/include/asm<br />
申明汇编函数的Include&#8221;包括&#8221;文件，它通常是指向 /usr/src/linux/include/asm 目录的符号连接<br />
/usr/include/linux<br />
包含系统变更的信息通常是指向 /usr/src/linux/include/linux 目录的符号连接表，来获得操作系统特定信息。<br />
(注：使用者应在此自行包含那些保证自己开发的程序正常运行所需的libc 函数库。不管怎样，Linux核心系统不是设计用来执行直接运行用户程序的，它并不知道用户程序需要使用哪个版本的libc库 。如果你随意将 /usr/include/asm 和 /usr/include/linux 指向一个系统核心，系统很可能崩溃。Debian系统不这么做。它使用 libc*-dev运行包中提供的核心系统标识，以保证启动所有正确的文件。)</em></p>
<p><em>/usr/include/g++<br />
GNU C++编译程序所使用的Include&#8221;包括&#8221;文件。<br />
/usr/lib<br />
目标库文件，包括动态连接库加上一些通常不是直接调用的可执行文件案。一些复杂的程序可能在此占用整个子目录。<br />
/usr/lib/X11<br />
存放X系统数据文件及系统配置文件的地方。 Linux中通常是指向 /usr/X11R6/lib/X11 目录的符号连接表。<br />
/usr/lib/gcc-lib<br />
GNU C 编译程序所使用的可执行文件案和&#8221;包括&#8221;文件。 gcc(1).<br />
/usr/lib/groff<br />
GNU groff 文件格式系统所使用的文件。<br />
/usr/lib/uucp<br />
uucp(1) 所使用的文件。<br />
/usr/lib/zoneinfo<br />
有关时区信息文件文件。<br />
/usr/local<br />
安装在本地执行程序的地方。<br />
/usr/local/bin<br />
在此地放置本地执行程序的二进制文件。<br />
/usr/local/doc<br />
放置本地文件。<br />
/usr/local/etc<br />
安装在本地程序的配置文件。<br />
/usr/local/lib<br />
安装在本地程序的库文件。<br />
/usr/local/info<br />
安装在本地程序有关信息文件。<br />
/usr/local/man<br />
安装在本地程序使用手册。<br />
/usr/local/sbin<br />
安装在本地的系统管理程序。<br />
/usr/local/src<br />
安装在本地程序的原始码。<br />
/usr/man<br />
手册页通常放在此目录，或相关子目录下。<br />
/usr/man//man[1-9]<br />
此目录在指定的地方以原始码形式存放手册页。系统在所有的手册页中使用自己独特的语言及代码集，可能会省略 substring 子字符串。<br />
/usr/sbin<br />
此目录保存系统管理程序的二进制码，这些文件不是系统启动或文件系统挂载 /usr 目录或修复系统所必需的。<br />
/usr/share<br />
在此目录下不同的子目录中保存了同一个操作系统在不同构架下工作时特定应用程序的共享数据。使用者可以找到通常放在 /usr/doc 或 /usr/lib 或 /usr/man 目录下的这些数据。<br />
/usr/src<br />
系统不同组成部份的源文件包括参考数据报。不要将你自己与项目有关的文件放这里，因为在安装软件外，/usr下的文件属性除通常设为只读。<br />
/usr/src/linux<br />
系统核心资源通常拆包安装于此。这是系统中重要的一环，因为 /usr/include/linux 符号连接表指向此目录。你应当使用其他目录来来编译建立新核心。<br />
/usr/tmp<br />
此目录不再使用了。它应指向目录 /var/tmp。 这个链接只是出于系统兼容的目的，一般不再使用。<br />
/var<br />
此目录下文件的大小可能会改变，如缓冲文件可日志文件。<br />
/var/adm<br />
此目录为 /var/log 甩替代，通常是指向 /var/log 的符号连接表。<br />
/var/backups<br />
此目录用来存放重要系统文件的后备文件<br />
/var/catman/cat[1-9] or /var/cache/man/cat[1-9]<br />
此目录存储根据手册分类预先格式化的参考手册页。(这些参考手册页是相互独立的)<br />
/var/lock<br />
此目录存储锁定文件。依据命名习惯，设备锁定文件是 LCKxxxxx xxxxx与在文件系统中该设备名相同，使用的格式是HDU UUCP锁定文件，例如包含进程标识PID的锁定文件是一个10字节的ASCII格式的数字，后面跟一个换行符。<br />
/var/log<br />
各种日志文件。<br />
/var/preserve<br />
这是 vi(1) 存放正在编辑中的文件，以便以后可以恢复。<br />
/var/run<br />
运行时的变量文件，如存放进程标识和登入使用者信息的文件。 (utmp) 此目录下文件在系统启动时被自动清除。<br />
/var/spool<br />
各种程序产生的缓冲或排除等待的文件<br />
/var/spool/at<br />
at(1) 的作业存缓区<br />
/var/spool/cron<br />
cron(1) 的作业存缓区<br />
/var/spool/lpd<br />
打印缓存文件。<br />
/var/spool/mail<br />
使用者邮箱。<br />
/var/spool/smail<br />
存放 smail(1) 邮件发送程序的缓冲文件。<br />
/var/spool/news<br />
新闻子系统的缓冲目录<br />
/var/spool/uucp<br />
uucp(1) 的缓冲文件<br />
/var/tmp<br />
类似 /tmp, 此目录保存未指定持续时间的临时文件。</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9227.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lsof 命令使用简介</title>
		<link>http://www.linuxsense.org/archives/9223.html</link>
		<comments>http://www.linuxsense.org/archives/9223.html#comments</comments>
		<pubDate>Wed, 25 Mar 2009 02:22:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux命令]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9223</guid>
		<description><![CDATA[lsof（list open files）是一个列出当前系统打开文件的工具。 在linux环境下，任何事物都以文件的形式存在，通过文件不仅仅可以访问常规数据，还可以访问网络连接和硬件。 所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等，系统在后台都为该应用程序分配了一个文件描述符，无论这个文件的本质如何，该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。 因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息，因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。 lsof使用 lsof输出信息含义在终端下输入lsof即可显示系统打开的文件，因为 lsof 需要访问核心内存和各种文件，所以必须以 root 用户的身份运行它才能够充分地发挥其功能。 COMMAND    PID      USER   FD      TYPE     DEVICE     SIZE       NODE      NAME init       1         root  cwd      DIR       3,3       1024       2         / init       1         root  rtd      DIR       3,3       1024       2         / init       1         root  txt      REG       3,3       38432      1763452  /sbin/init init       1         root  [...]]]></description>
			<content:encoded><![CDATA[<p>lsof（list open files）是一个列出当前系统打开文件的工具。</p>
<p>在linux环境下，任何事物都以文件的形式存在，通过文件不仅仅可以访问常规数据，还可以访问网络连接和硬件。</p>
<p>所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等，系统在后台都为该应用程序分配了一个文件描述符，无论这个文件的本质如何，该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。</p>
<p>因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息，因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。</p>
<p>lsof使用 lsof输出信息含义在终端下输入lsof即可显示系统打开的文件，因为 lsof 需要访问核心内存和各种文件，所以必须以 root 用户的身份运行它才能够充分地发挥其功能。</p>
<blockquote><p>COMMAND    PID      USER   FD      TYPE     DEVICE     SIZE       NODE      NAME<br />
init       1         root  cwd      DIR       3,3       1024       2         /<br />
init       1         root  rtd      DIR       3,3       1024       2         /<br />
init       1         root  txt      REG       3,3       38432      1763452  /sbin/init<br />
init       1         root  mem      REG       3,3       106114     1091620  /lib/libdl-2.6.so<br />
init       1         root  mem      REG       3,3       7560696    1091614  /lib/libc-2.6.so<br />
init       1         root  mem      REG       3,3       79460      1091669  /lib/libselinux.so.1<br />
init       1         root  mem      REG       3,3       223280     1091668  /lib/libsepol.so.1<br />
init       1         root  mem      REG       3,3       564136     1091607  /lib/ld-2.6.so<br />
init       1         root  10u      FIFO      0,15                  1309     /dev/initctl</p></blockquote>
<p><span id="more-9223"></span></p>
<p>每行显示一个打开的文件，若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下：</p>
<p>COMMAND：进程的名称<br />
PID：进程标识符<br />
USER：进程所有者<br />
FD：文件描述符，应用程序通过文件描述符识别该文件。如cwd、txt等<br />
TYPE：文件类型，如DIR、REG等<br />
DEVICE：指定磁盘的名称<br />
SIZE：文件的大小<br />
NODE：索引节点（文件在磁盘上的标识）<br />
NAME：打开文件的确切名称</p>
<p>其中FD 列中的文件描述符cwd 值表示应用程序的当前工作目录，这是该应用程序启动的目录，除非它本身对这个目录进行更改。</p>
<p>txt 类型的文件是程序代码，如应用程序二进制文件本身或共享库，如上列表中显示的 /sbin/init 程序。</p>
<p>其次数值表示应用程序的文件描述符，这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl，其文件描述符为 10。</p>
<p>u 表示该文件被打开并处于读取/写入模式，而不是只读 ® 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。</p>
<p>初始打开每个应用程序时，都具有三个文件描述符，从 0 到 2，分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。</p>
<p>与 FD 列相比，Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK，分别表示字符和块设备；或者 UNIX、FIFO 和 IPv4，分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。</p>
<p>lsof常用参数lsof 常见的用法是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处，或者正在跟踪某个问题。</p>
<p>例如，linux限制了进程能够打开文件的数目。通常这个数值很大，所以不会产生问题，并且在需要时，应用程序可以请求更大的值（直到某个上限）。如果你怀疑应用程序耗尽了文件描述符，那么可以使用 lsof 统计打开的文件数目，以进行验证。</p>
<p>lsof语法格式是： lsof ［options］ filename</p>
<p>常用的参数列表：</p>
<p>lsof filename 显示打开指定文件的所有进程<br />
lsof -a 表示两个参数都必须满足时才显示结果<br />
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件<br />
lsof -u username 显示所属user进程打开的文件<br />
lsof -g gid 显示归属gid的进程情况<br />
lsof +d /DIR/ 显示目录下被进程打开的文件<br />
lsof +D /DIR/ 同上，但是会搜索目录下的所有目录，时间相对较长<br />
lsof -d FD 显示指定文件描述符的进程<br />
lsof -n 不将IP转换为hostname，缺省是不加上-n参数<br />
lsof -i 用以显示符合条件的进程情况<br />
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]<br />
46 &#8211;&gt; IPv4 or IPv6<br />
protocol &#8211;&gt; TCP or UDP<br />
hostname &#8211;&gt; Internet host name<br />
hostaddr &#8211;&gt; IPv4地址<br />
service &#8211;&gt; /etc/service中的 service name (可以不只一个)<br />
port &#8211;&gt; 端口号 (可以不只一个)</p>
<p>例如： 查看22端口现在运行的情况 # lsof -i :22</p>
<p>COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME<br />
sshd 1409 root 3u IPv6 5678 TCP *:ssh (LISTEN)</p>
<p>查看所属root用户进程所打开的文件类型为txt的文件: # lsof -a -u root -d txt<br />
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME<br />
init 1 root txt REG 3,3 38432 1763452 /sbin/init<br />
mingetty 1632 root txt REG 3,3 14366 1763337 /sbin/mingetty<br />
mingetty 1633 root txt REG 3,3 14366 1763337 /sbin/mingetty<br />
mingetty 1634 root txt REG 3,3 14366 1763337 /sbin/mingetty<br />
mingetty 1635 root txt REG 3,3 14366 1763337 /sbin/mingetty<br />
mingetty 1636 root txt REG 3,3 14366 1763337 /sbin/mingetty<br />
mingetty 1637 root txt REG 3,3 14366 1763337 /sbin/mingetty<br />
kdm 1638 root txt REG 3,3 132548 1428194 /usr/bin/kdm<br />
X 1670 root txt REG 3,3 1716396 1428336 /usr/bin/Xorg<br />
kdm 1671 root txt REG 3,3 132548 1428194 /usr/bin/kdm<br />
startkde 2427 root txt REG 3,3 645408 1544195 /bin/bash<br />
&#8230; &#8230;</p>
<p><strong>lsof使用实例</strong></p>
<p>一、查找谁在使用文件系统在卸载文件系统时，如果该文件系统中有任何打开的文件，操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统，如下：</p>
<p># lsof /GTES11/<br />
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME<br />
bash 4208 root cwd DIR 3,1 4096 2 /GTES11/<br />
vim 4230 root cwd DIR 3,1 4096 2 /GTES11/</p>
<p>在这个示例中，用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运行，并且它当前的目录为/GTES11，另一个则显示的是vim正在编辑/GTES11下的文件。要成功地卸载/GTES11，应该在通知用户以确保情况正常之后，中止这些进程。</p>
<p>这个示例说明了应用程序的当前工作目录非常重要，因为它仍保持着文件资源，并且可以防止文件系统被卸载。这就是为什么大部分守护进程（后台进程）将它们的目录更改为根目录、或服务特定的目录（如 sendmail 示例中的 /var/spool/mqueue）的原因，以避免该守护进程阻止卸载不相关的文件系统。</p>
<p>二、恢复删除的文件当Linux计算机受到入侵时，常见的情况是日志文件被删除，以掩盖攻击者的踪迹。</p>
<p>管理错误也可能导致意外删除重要的文件，比如在清理旧日志时，意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。 当进程打开了某个文件时，只要该进程保持打开该文件，即使将其删除，它依然存在于磁盘中。</p>
<p>这意味着，进程并不知道文件已经被删除，它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。</p>
<p>除了该进程之外，这个文件是不可见的，因为已经删除了其相应的目录索引节点。</p>
<p>在/proc 目录下，其中包含了反映内核和进程树的各种文件。</p>
<p>/proc目录挂载的是在内存中所映射的一块区域，所以这些文件和目录并不存在于磁盘中，因此当我们对这些文件进行读取和写入时，实际上是在从内存中获取相关信息。</p>
<p>大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中，即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。</p>
<p>每个进程目录中存在着各种文件，它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。</p>
<p>lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。</p>
<p>所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。</p>
<p>当系统中的某个文件被意外地删除了，只要这个时候系统中还有进程正在访问该文件，那么我们就可以通过lsof从/proc目录下恢复该文件的内容。</p>
<p>假如由于误操作将/var/log/messages文件删除掉了，那么这时要将/var/log/messages文件恢复的方法如下：</p>
<p>首先使用lsof来查看当前是否有进程打开/var/logmessages文件，如下：</p>
<p># lsof |grep /var/log/messages<br />
syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)<br />
从上面的信息可以看到 PID 1283（syslogd）打开文件的文件描述符为2。同时还可以看到/var/log/messages已经标记被删除了。</p>
<p>因此我们可以在 /proc/1283/fd/2 （fd下的每个以数字命名的文件表示进程对应的文件描述符）中查看相应的信息，如下：</p>
<p># head -n 10 /proc/1283/fd/2<br />
Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.<br />
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.<br />
Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007<br />
Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map:<br />
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 &#8211; 000000000009f000 (usable)<br />
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 &#8211; 00000000000a0000 (reserved)<br />
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 &#8211; 000000001f7d3800 (usable)<br />
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 &#8211; 0000000020000000 (reserved)<br />
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 &#8211; 00000000f0007000 (reserved)<br />
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 &#8211; 00000000f000c000 (reserved)</p>
<p>从上面的信息可以看出，查看 /proc/8663/fd/15 就可以得到所要恢复的数据。</p>
<p>如果可以通过文件描述符查看相应的数据，那么就可以使用 I/O 重定向将其复制到文件中，</p>
<p>如: cat /proc/1283/fd/2 &gt; /var/log/messages<br />
对于许多应用程序，尤其是日志文件和数据库，这种恢复删除文件的方法非常有用。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
<strong>摘录总结lsof用法：</strong></p>
<p>　　lsof filename.txt 显示开启文件filename.txt的进程</p>
<p>　　lsof -i :22 知道22端口现在运行什么程序</p>
<p>　　lsof -c abc 显示abc进程现在打开的文件</p>
<p>　　lsof -g gid 显示归属gid的进程情况</p>
<p>　　lsof +d /usr/local/ 显示目录下被进程开启的文件</p>
<p>　　lsof +D /usr/local/ 同上，但是会搜索目录下的目录，时间较长</p>
<p>　　lsof -d 4 显示使用fd为4的进程</p>
<p>　　lsof -i 用以显示符合条件的进程情况</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9223.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ulimit 命令</title>
		<link>http://www.linuxsense.org/archives/9219.html</link>
		<comments>http://www.linuxsense.org/archives/9219.html#comments</comments>
		<pubDate>Wed, 25 Mar 2009 01:52:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux命令]]></category>
		<category><![CDATA[ulimit]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9219</guid>
		<description><![CDATA[1. 说明: ulimit用于shell启动进程所占用的资源. 2. 类别: shell内建命令 3. 语法格式: ulimit [-acdfHlmnpsStvw] [size] 4. 参数介绍: -H 设置硬件资源限制. -S 设置软件资源限制. -a 显示当前所有的资源限制. -c size:设置core文件的最大值.单位:blocks -d size:设置数据段的最大值.单位:kbytes -f size:设置创建文件的最大值.单位:blocks -l size:设置在内存中锁定进程的最大值.单位:kbytes -m size:设置可以使用的常驻内存的最大值.单位:kbytes -n size:设置内核可以同时打开的文件描述符的最大值.单位:n -p size:设置管道缓冲区的最大值.单位:kbytes -s size:设置堆栈的最大值.单位:kbytes -t size:设置CPU使用时间的最大上限.单位:seconds -v size:设置虚拟内存的最大值.单位:kbytes 5,简单实例: 5. 举例 在Linux下写程序的时候，如果程序比较大，经常会遇到“段错误”（segmentation fault）这样的问题，这主要就是由于Linux系统初始的堆栈大小（stack size）太小的缘故，一般为10M。我一般把stack size设置成256M，这样就没有段错误了！命令为： ulimit -s 262140 如果要系统自动记住这个配置，就编辑/etc/profile文件，在 “ulimit -S -c 0 &#62; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1. 说明:</strong><br />
ulimit用于shell启动进程所占用的资源.<br />
<strong>2. 类别:</strong><br />
shell内建命令<br />
<strong>3. 语法格式:</strong><br />
ulimit [-acdfHlmnpsStvw] [size]<br />
<strong>4. 参数介绍:</strong><br />
-H 设置硬件资源限制.<br />
-S 设置软件资源限制.<br />
-a 显示当前所有的资源限制.<br />
-c size:设置core文件的最大值.单位:blocks<br />
-d size:设置数据段的最大值.单位:kbytes<br />
-f size:设置创建文件的最大值.单位:blocks<br />
-l size:设置在内存中锁定进程的最大值.单位:kbytes<br />
-m size:设置可以使用的常驻内存的最大值.单位:kbytes<br />
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n<br />
-p size:设置管道缓冲区的最大值.单位:kbytes<br />
-s size:设置堆栈的最大值.单位:kbytes<br />
-t size:设置CPU使用时间的最大上限.单位:seconds<br />
-v size:设置虚拟内存的最大值.单位:kbytes 5,简单实例:</p>
<p><span id="more-9219"></span><br />
<strong>5. 举例</strong><br />
在Linux下写程序的时候，如果程序比较大，经常会遇到“段错误”（segmentation fault）这样的问题，这主要就是由于Linux系统初始的堆栈大小（stack size）太小的缘故，一般为10M。我一般把stack size设置成256M，这样就没有段错误了！命令为：<br />
ulimit -s 262140<br />
如果要系统自动记住这个配置，就编辑/etc/profile文件，在 “ulimit -S -c 0 &gt; /dev/null 2&gt;&amp;1”行下，添加“ulimit -s 262140”，保存重启系统就可以了！<br />
1]在RH8的环境文件/etc/profile中,我们可以看到系统是如何配置ulimit的:<br />
#grep ulimit /etc/profile<br />
ulimit -S -c 0 &gt; /dev/null 2&gt;&amp;1<br />
这条语句设置了对软件资源和对core文件大小的设置<br />
2]如果我们想要对由shell创建的文件大小作些限制,如:<br />
#ll h<br />
-rw-r&#8211;r&#8211; 1 lee lee 150062 7月 22 02:39 h<br />
#ulimit -f 100 #设置创建文件的最大块(一块=512字节)<br />
#cat h&gt;newh<br />
File size limit exceeded<br />
#ll newh<br />
-rw-r&#8211;r&#8211; 1 lee lee 51200 11月 8 11:47 newh<br />
文件h的大小是150062字节,而我们设定的创建文件的大小是512字节x100块=51200字节<br />
当然系统就会根据你的设置生成了51200字节的newh文件.<br />
3]可以像实例1]一样,把你要设置的ulimit放在/etc/profile这个环境文件中.<br />
用途<br />
设置或报告用户资源极限。<br />
语法<br />
ulimit [ -H ] [ -S ] [ -a ] [ -c ] [ -d ] [ -f ] [ -m ] [ -n ] [ -s ] [ -t ] [ Limit ]<br />
描述<br />
ulimit 命令设置或报告用户进程资源极限，如 /etc/security/limits 文件所定义。文件包含以下缺省值极限：<br />
fsize = 2097151<br />
core = 2097151<br />
cpu = -1<br />
data = 262144<br />
rss = 65536<br />
stack = 65536<br />
nofiles = 2000<br />
当新用户添加到系统中时，这些值被作为缺省值使用。当向系统中添加用户时，以上值通过 mkuser 命令设置，或通过 chuser 命令更改。<br />
极限分为软性或硬性。通过 ulimit 命令，用户可将软极限更改到硬极限的最大设置值。要更改资源硬极限，必须拥有 root 用户权限。<br />
很多系统不包括以上一种或数种极限。 特定资源的极限在指定 Limit 参数时设定。Limit 参数的值可以是每个资源中指定单元中的数字，或者为值 unlimited。要将特定的 ulimit 设置为 unlimited，可使用词 unlimited。<br />
注：在 /etc/security/limits 文件中设置缺省极限就是设置了系统宽度极限， 而不仅仅是创建用户时用户所需的极限。<br />
省略 Limit 参数时，将会打印出当前资源极限。除非用户指定 -H 标志，否则打印出软极限。当用户指定一个以上资源时，极限名称和单元在值之前打印。如果未给予选项，则假定带有了 -f 标志。<br />
由于 ulimit 命令影响当前 shell 环境，所以它将作为 shell 常规内置命令提供。如果在独立的命令执行环境中调用该命令，则不影响调用者环境的文件大小极限。以下示例中正是这种情况：<br />
nohup ulimit -f 10000<br />
env ulimit 10000<br />
一旦通过进程减少了硬极限，若无 root 特权则无法增加，即使返回到原值也不可能。<br />
关于用户和系统资源极限的更多信息，请参见 AIX 5L Version 5.3 Technical Reference: Base Operating System and Extensions Volume 1 中的 getrlimit、setrlimit 或 vlimit 子例程。<br />
标志<br />
-a 列出所有当前资源极限。<br />
-c 以 512 字节块为单位，指定核心转储的大小。<br />
-d 以 K 字节为单位指定数据区域的大小。<br />
-f 使用 Limit 参数时设定文件大小极限（以块计），或者在未指定参数时报告文件大小极限。缺省值为 -f 标志。<br />
-H 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限，可以增大硬极限。任何用户均可减少硬极限。<br />
-m 以 K 字节为单位指定物理存储器的大小。<br />
-n 指定一个进程可以拥有的文件描述符的数量的极限。<br />
-s 以 K 字节为单位指定堆栈的大小。<br />
-S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定，极限适用于以上二者。<br />
-t 指定每个进程所使用的秒数。<br />
退出状态<br />
返回以下退出值：<br />
0 成功完成。<br />
&gt;0 拒绝对更高的极限的请求，或发生错误。<br />
示例<br />
要将文件大小极限设置为 51,200 字节，输入：<br />
ulimit -f 100</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9219.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>简单了解下MySQL的各种存储引擎</title>
		<link>http://www.linuxsense.org/archives/9214.html</link>
		<comments>http://www.linuxsense.org/archives/9214.html#comments</comments>
		<pubDate>Thu, 05 Mar 2009 00:57:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[web构架]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[存储引擎]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9214</guid>
		<description><![CDATA[MySQL有多种存储引擎，每种存储引擎有各自的优缺点，同学们可以择优选择使用： MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。 MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎： · MyISAM管理非事务表。它提供高速存储和检索，以及全文搜索能力。MyISAM在所有MySQL配置里被支持，它是默认的存储引擎，除非你配置MySQL默认使用另外一个引擎。 · MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样，MEMORY和MERGE存储引擎处理非事务表，这两个引擎也都被默认包含在MySQL中。 注释：MEMORY存储引擎正式地被确定为HEAP引擎。 · InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里，你可以按照喜好通过配置MySQL来允许或禁止任一引擎。 · EXAMPLE存储引擎是一个“存根”引擎，它不做什么。你可以用这个引擎创建表，但没有数据被存储于其中或从其中检索。这个引擎的目的是服务，在 MySQL源代码中的一个例子，它演示说明如何开始编写新存储引擎。同样，它的主要兴趣是对开发者。 · NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中，我们想要添加其它平台对这个引擎的支持，包括Windows。 · ARCHIVE存储引擎被用来无索引地，非常小地覆盖存储的大量数据。 · CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。 · BLACKHOLE存储引擎接受但不存储数据，并且检索总是返回一个空集。 · FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中，它只和MySQL一起工作，使用MySQL C Client API。在未来的分发版中，我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。 当你创建一个新表的时候，你可以通过添加一个ENGINE 或TYPE 选项到CREATE TABLE语句来告诉MySQL你要创建什么类型的表： CREATE TABLE t (i INT) ENGINE = INNODB; CREATE TABLE t (i INT) TYPE [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL有多种存储引擎，每种存储引擎有各自的优缺点，同学们可以择优选择使用：</p>
<p>MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。</p>
<p>MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎：</p>
<p>· MyISAM管理非事务表。它提供高速存储和检索，以及全文搜索能力。MyISAM在所有MySQL配置里被支持，它是默认的存储引擎，除非你配置MySQL默认使用另外一个引擎。</p>
<p>· MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样，MEMORY和MERGE存储引擎处理非事务表，这两个引擎也都被默认包含在MySQL中。</p>
<p>注释：MEMORY存储引擎正式地被确定为HEAP引擎。</p>
<p>· InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里，你可以按照喜好通过配置MySQL来允许或禁止任一引擎。</p>
<p><span id="more-9214"></span><br />
· EXAMPLE存储引擎是一个“存根”引擎，它不做什么。你可以用这个引擎创建表，但没有数据被存储于其中或从其中检索。这个引擎的目的是服务，在 MySQL源代码中的一个例子，它演示说明如何开始编写新存储引擎。同样，它的主要兴趣是对开发者。</p>
<p>· NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中，我们想要添加其它平台对这个引擎的支持，包括Windows。</p>
<p>· ARCHIVE存储引擎被用来无索引地，非常小地覆盖存储的大量数据。</p>
<p>· CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。</p>
<p>· BLACKHOLE存储引擎接受但不存储数据，并且检索总是返回一个空集。</p>
<p>· FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中，它只和MySQL一起工作，使用MySQL C Client API。在未来的分发版中，我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。</p>
<p>当你创建一个新表的时候，你可以通过添加一个ENGINE 或TYPE 选项到CREATE TABLE语句来告诉MySQL你要创建什么类型的表：</p>
<p>CREATE TABLE t (i INT) ENGINE = INNODB;</p>
<p>CREATE TABLE t (i INT) TYPE = MEMORY;</p>
<p>虽然TYPE仍然在MySQL 5.1中被支持，现在ENGINE是首选的术语。</p>
<p>如何选择最适合你的存储引擎呢？</p>
<p>下述存储引擎是最常用的：</p>
<p>· MyISAM：默认的MySQL插件式存储引擎，它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意，通过更改STORAGE_ENGINE配置变量，能够方便地更改MySQL服务器的默认存储引擎。</p>
<p>· InnoDB：用于事务处理应用程序，具有众多特性，包括ACID事务支持。</p>
<p>· BDB：可替代InnoDB的事务引擎，支持COMMIT、ROLLBACK和其他事务特性。</p>
<p>· Memory：将所有数据保存在RAM中，在需要快速查找引用和其他类似数据的环境下，可提供极快的访问。</p>
<p>· Merge：允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起，并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。</p>
<p>· Archive：为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。</p>
<p>· Federated：能够将多个分离的MySQL服务器链接起来，从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。</p>
<p>· Cluster/NDB：MySQL的簇式数据库引擎，尤其适合于具有高性能查找要求的应用程序，这类查找需求还要求具有最高的正常工作时间和可用性。</p>
<p>· Other：其他存储引擎包括CSV（引用由逗号隔开的用作数据库表的文件），Blackhole（用于临时禁止对数据库的应用程序输入），以及Example引擎（可为快速创建定制的插件式存储引擎提供帮助）。</p>
<p>请记住，对于整个服务器或方案，你并不一定要使用相同的存储引擎，你可以为方案中的每个表使用不同的存储引擎，这点很重要。<br />
<span style="font-size:10px;"><br />
mysql&gt; show engines;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</span><span style="font-size:9px;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span><span style="font-size:9px;">&#8212;&#8212;</span><span style="font-size:9px;">&#8212;</span><span style="font-size:9px;">&#8212;</span><span style="font-size:9px;">&#8212;</span><span style="font-size:9px;">&#8212;&#8212;</span><span style="font-size:9px;">&#8212;&#8212;&#8211;+<br />
| Engine                    | Support    | Comment </span><span style="font-size:9px;"> </span><span style="font-size:9px;"> </span><span style="font-size:9px;"> |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</span><span style="font-size:9px;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</span><span style="font-size:9px;">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| MyISAM                | DEFAULT | Default engine as of MySQL 3.23 with great performance              |<br />
| MEMORY             | YES              | Hash based, stored in memory, useful for temporary tables       |<br />
| InnoDB                  | YES              | Supports transactions, row-level locking, and foreign keys         |<br />
| BerkeleyDB         | NO                | Supports transactions and page-level locking                                    |<br />
| BLACKHOLE        | NO                | /dev/null storage engine (anything you write to it disappears) |<br />
| EXAMPLE             | NO                | Example storage engine                                                                                |<br />
| ARCHIVE             | NO               | Archive storage engine                                                                                  |<br />
| CSV                         | NO               | CSV storage engine                                                                                          |<br />
| ndbcluster           | NO               | Clustered, fault-tolerant, memory-based tables                                |<br />
| FEDERATED        | NO                | Federated MySQL storage engine                                                             |<br />
| MRG_MYISAM  | YES             | Collection of identical MyISAM tables                                                   |<br />
| ISAM                      | NO               | Obsolete storage engine                                                                                |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9214.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>理解bash的case</title>
		<link>http://www.linuxsense.org/archives/9211.html</link>
		<comments>http://www.linuxsense.org/archives/9211.html#comments</comments>
		<pubDate>Thu, 26 Feb 2009 10:20:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[shell编程]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[case]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9211</guid>
		<description><![CDATA[从网上找到的一段代码，对于学习bash的同学理解case想必很有帮助 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; #!/bin/bash #################################################### # Program: # File operation # 1.) Open file 2.) Display file 3.) Edit file 4.) Delete file # History: # 2006/11/03 BianYuan First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221; echo &#8220;List of item to operate file -&#8221; echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221; echo &#8220;1). Open a file -&#8221; echo &#8220;2). Display a file [...]]]></description>
			<content:encoded><![CDATA[<p>从网上找到的一段代码，对于学习bash的同学理解case想必很有帮助<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
#!/bin/bash<br />
####################################################<br />
# Program:<br />
# File operation<br />
# 1.) Open file 2.) Display file 3.) Edit file 4.) Delete file<br />
# History:<br />
# 2006/11/03 BianYuan First release<br />
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin<br />
export PATH<br />
echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;<br />
echo &#8220;List of item to operate file -&#8221;<br />
echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;<br />
<span id="more-9211"></span><br />
echo &#8220;1). Open a file -&#8221;<br />
echo &#8220;2). Display a file -&#8221;<br />
echo &#8220;3). Edit a file -&#8221;<br />
echo &#8220;4). Delete a file -&#8221;<br />
echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;<br />
read select<br />
case $select in<br />
1)<br />
echo &#8220;do open file operation&#8221;<br />
;;<br />
2)<br />
echo &#8220;do display a file operation&#8221;<br />
;;<br />
3)<br />
echo &#8220;do edit a file operation&#8221;<br />
;;<br />
4)<br />
echo &#8220;do delete a file operation&#8221;<br />
;;<br />
*)<br />
echo &#8220;There is nothing to do!&#8221;<br />
exit 1<br />
;;<br />
esac</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9211.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>perl范围声明our,my,local</title>
		<link>http://www.linuxsense.org/archives/9207.html</link>
		<comments>http://www.linuxsense.org/archives/9207.html#comments</comments>
		<pubDate>Wed, 25 Feb 2009 03:42:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[local]]></category>
		<category><![CDATA[my]]></category>
		<category><![CDATA[our]]></category>
		<category><![CDATA[perl范围声明]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9207</guid>
		<description><![CDATA[本文系转载，对初学perl的同学相信有一定借鉴作用 老实说，这个东西有点折腾人，主要是书上的表述很晦涩，其实搞懂不难。 our,&#8221;把名字限于某个范围“，其实就是明确声明一个&#8221;全局变量&#8221;，虽然是在某个模块或者函数里面定义的，外面的也可以访问，如果已经声明过了，再次用&#8221;our&#8221;,表示此处用的是全局的那个，不是同名的私有或者局部变量 our $PROGRAM_NAME = &#8220;waiter&#8221;; { my $PROGRAM_NAME = &#8220;something&#8221;; our $PROGRAM_NAME = &#8220;server&#8221;; #这里的our和外面的相同，和前句不同。 # 这里调用的代码看到的是&#8221;server&#8221; } # 这里执行的代码看到的仍然是&#8221;server&#8221;. my ,&#8221;把名字和值都限于限于某个范围&#8221;,简单说，就是只能本层模块或者函数可以看到这个变量，高一层的或者低一层的都看不到的。 sub greeting1{ my ($hello) = &#8220;How are you do?&#8221;; greeting2(); } sub greeting2{ print &#8220;$hello\n&#8221;; } $hello = &#8220;How are you doing?&#8221;; greeting2(); greeting1(); greeting2(); 运行结果： How are you doing? How [...]]]></description>
			<content:encoded><![CDATA[<p>本文系转载，对初学perl的同学相信有一定借鉴作用</p>
<p>老实说，这个东西有点折腾人，主要是书上的表述很晦涩，其实搞懂不难。</p>
<p>our,&#8221;把名字限于某个范围“，其实就是明确声明一个&#8221;全局变量&#8221;，虽然是在某个模块或者函数里面定义的，外面的也可以访问，如果已经声明过了，再次用&#8221;our&#8221;,表示此处用的是全局的那个，不是同名的私有或者局部变量</p>
<p>our $PROGRAM_NAME = &#8220;waiter&#8221;;<br />
{</p>
<p>my $PROGRAM_NAME = &#8220;something&#8221;;<br />
our $PROGRAM_NAME = &#8220;server&#8221;; #这里的our和外面的相同，和前句不同。<br />
# 这里调用的代码看到的是&#8221;server&#8221;<br />
}<br />
# 这里执行的代码看到的仍然是&#8221;server&#8221;.</p>
<p><span id="more-9207"></span></p>
<p>my ,&#8221;把名字和值都限于限于某个范围&#8221;,简单说，就是只能本层模块或者函数可以看到这个变量，高一层的或者低一层的都看不到的。<br />
sub greeting1{<br />
my ($hello) = &#8220;How are you do?&#8221;;<br />
greeting2();<br />
}</p>
<p>sub greeting2{<br />
print &#8220;$hello\n&#8221;;<br />
}<br />
$hello = &#8220;How are you doing?&#8221;;<br />
greeting2();<br />
greeting1();<br />
greeting2();</p>
<p>运行结果：<br />
How are you doing?<br />
How are you doing?<br />
How are you doing?<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
一个 How are you do? 都没有,在greeting1中call greeting2时，greeting2看不到greeting1的私有 $hello变量，只能看到外面的全局变量$hello</p>
<p>local,&#8221;把值局限于某个范围&#8221;，也有叫&#8221;动态词法范围&#8221;,有点不好懂。我的理解，就是本层和本层下层的函数可以看到本层的变量，但是本层上一层的不可以。到底范围是多少，不仅取决于本层的函数，还要看下一层的程序长度和深度，所以叫&#8221;动态范围&#8221;。</p>
<p>sub greeting1{<br />
local ($hello) = &#8220;How are you do?&#8221;;<br />
greeting2();<br />
}</p>
<p>sub greeting2{<br />
print &#8220;$hello\n&#8221;;<br />
}<br />
$hello = &#8220;How are you doing?&#8221;;<br />
greeting2();<br />
greeting1();<br />
greeting2();</p>
<p>运行结果：<br />
How are you doing?<br />
How are you do?<br />
How are you doing?<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
跟用 my 时不一样了吧? 此时在greeting1调用greeting2时，greeting2可以看到greeting1的局部变量$hello,外部的全局变量当然就隐藏了。</p>
<p>原文地址：<span style="text-decoration: underline;"><a href="http://blog.chinaunix.net/u1/51156/showart_441696.html">http://blog.chinaunix.net/u1/51156/showart_441696.html</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9207.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Use Strict And Warnings （Perl）</title>
		<link>http://www.linuxsense.org/archives/9204.html</link>
		<comments>http://www.linuxsense.org/archives/9204.html#comments</comments>
		<pubDate>Wed, 25 Feb 2009 03:25:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Strict]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9204</guid>
		<description><![CDATA[本文系转载，原文链接地址失效，可以去搜索引擎去搜索标题 取自PerlChina 跳转到:导航,搜索 原 名：Use Strict And Warnings 中 文: 如何使用 strict 和 warnings 作 者：runiq 原 文地址已经无效 发 表：Sep 07, 2001 翻 译：havel.zhang 审 校：qiang 出 处：中国 Perl 协会 FPC &#8211; PerlChina.org 提醒您：请保护作者的著作权,维护作者劳动的结晶。 目录 1 什么场合要用 use strict 2 为什么要用 use strict？ 3 用 use strict 麻烦吗？ 4 不错，那我怎么用 use strict 呢？ 5 得，程序出错了，我该怎么办？ [...]]]></description>
			<content:encoded><![CDATA[<p>本文系转载，原文链接地址失效，可以去搜索引擎去搜索标题</p>
<p><span style="color: #999999;">取自PerlChina<br />
跳转到:导航,搜索<br />
原 名：Use Strict And Warnings<br />
中 文: 如何使用 strict 和 warnings<br />
作 者：runiq<br />
原 文地址已经无效<br />
发 表：Sep 07, 2001<br />
翻 译：havel.zhang<br />
审 校：qiang<br />
出 处：中国 Perl 协会 FPC &#8211; PerlChina.org<br />
提醒您：请保护作者的著作权,维护作者劳动的结晶。</span></p>
<p><strong>目录<br />
<span style="text-decoration: underline;">1 什么场合要用 use strict<br />
2 为什么要用 use strict？<br />
3 用 use strict 麻烦吗？<br />
4 不错，那我怎么用 use strict 呢？<br />
5 得，程序出错了，我该怎么办？<br />
6 这也太麻烦了吧。懒惰不是 Perl 文化中的美德吗？<br />
7 那 warnings 又是什么？</span></strong></p>
<p><strong>什么场合要用 use strict</strong><br />
当你的程序有一定的行数时，尤其是在一页放不下时，或者是你找不到发生错误的原因时。<br />
<span id="more-9204"></span></p>
<p><strong>为什么要用 use strict？</strong><br />
众多的原因之一是帮你寻找因为错误拼写造成的错误。比如错误使用了&#8217;$recieve_date&#8217; 变量，但实际上你在程序中已声明的是 &#8216;$receive_date&#8217; 变量，这个错误就很难发现。同样，use strict 迫使你把变量的范围缩到最小，使你不必担心同名变量在程序的其它部份发生不良作用。（尽管这是 my 的功能，但是如果你使用 use strict 的话，它会强迫你用 my 声明变量，来达到上述目的）。</p>
<p><strong>用 use strict 麻烦吗？</strong><br />
不麻烦，只要在你的脚本的开始加上11个字符而已！(use strict;), 另外在整个程序中用my 声明变量。</p>
<p><strong>不错，那我怎么用 use strict 呢？</strong><br />
在你的脚本的开头 &#8216;#!/usr/local/bin/perl&#8217; 后面加上这句就行。</p>
<p>use strict;</p>
<p><strong>得，程序出错了，我该怎么办？<br />
</strong>常见的错误信息一般如下：</p>
<p>Global symbol &#8220;$xxx&#8221; requires explicit package name at ./tst line 5.这就是需要我们马上去解决的错误。（如果出现类似于 &#8216;Server Error&#8217; 之类的错误，请检查一下你的 web 服务器上的 error logs， 或用CGI::Carp包。 ）</p>
<p>任何时候，当你要声明一个变量时，都要把 &#8216;my&#8217; 放在前面。例如：</p>
<p># 把这段代码:<br />
$string = &#8220;hello world&#8221;;<br />
@array = qw(ABC DEF);<br />
%hash = (A=&gt;1, B=&gt;2);</p>
<p># 改成:<br />
my $string = &#8220;hello world&#8221;;<br />
my @array = qw(ABC DEF);<br />
my %hash = (A=&gt;1, B=&gt;2);</p>
<p># 把这段代码:<br />
# &#8216;$name&#8217; is global here<br />
foreach $name (@names) {<br />
print &#8220;Name: $name\n&#8221;;<br />
}</p>
<p># 改成:<br />
foreach my $name (@names) {<br />
# Now &#8216;$name&#8217; only exists in this block<br />
print &#8220;Name: $name\n&#8221;;<br />
}</p>
<p># 把这段代码:<br />
# 同样, &#8216;$digit&#8217; 在这里是全局变量<br />
foreach $digit (@digits) {<br />
$number = 10== $number + $digit;<br />
}<br />
print &#8220;Number: $number\n&#8221;;</p>
<p># 改成： (外层的变量(&#8216;$number&#8217;)<br />
# 将在外层声明):<br />
my $number = 0;<br />
foreach my $digit (@digits)<br />
# 现在&#8217;$digit&#8217; 仅仅在这个代码块里存在<br />
$number = 10== $number + $digit;<br />
}<br />
print &#8220;Number: $number\n&#8221;;</p>
<p># 把这段代码:<br />
sub my_sub {<br />
($arg1, $arg2) = @_;<br />
print &#8220;Arg1: $arg1 Arg2: $arg2\n&#8221;;<br />
}</p>
<p># 改成:<br />
sub my_sub {<br />
my ($arg1, $arg2) = @_;<br />
print &#8220;Arg1: $arg1 Arg2: $arg2\n&#8221;;<br />
}</p>
<p># 下面的代码好像在用 DBI 嘛？一样要改！:<br />
$sth-&gt;bind_columns(\$field1, \$field2);<br />
while ($sth-&gt;fetch) {<br />
print &#8220;F1: $field1 F2: $field2\n&#8221;;<br />
}</p>
<p># 改成:<br />
$sth-&gt;bind_columns(\my ($field1, $field2));<br />
while ($sth-&gt;fetch) {<br />
print &#8220;F1: $field1 F2: $field2\n&#8221;;<br />
}</p>
<p><strong>这也太麻烦了吧。懒惰不是 Perl 文化中的美德吗？</strong><br />
当然，懒惰是我们的美德。因为你会发现使用 use strict 之后，我们就不必花太多的时间自己去查找 use strict 可以找到的很多简单错误。</p>
<p><strong>那 warnings 又是什么？</strong><br />
哦，对了。在 Perl 5.6 及以后的版本里，我们可以在写 &#8216;use strict;&#8217; 的位置旁写 &#8216;use warnings;&#8217;:</p>
<p>use warnings;在 Perl 5.6 版之前（或者为了不同 Perl 版本间的兼容 ），你可以用命令行参数 &#8216;#!/usr/bin/perl -w&#8217;。还有一种办法是设置<br />
$^W变量（不过，如果<br />
$^W不在BEGIN{}程序块里的话，就没办法截取编译时的错误提示，所以一般我们用 &#8216;-w&#8217;）:<br />
#!/usr/local/bin/perl -w</p>
<p># 或者<br />
$^W = 1;<br />
# 或者<br />
BEGIN { $^W = 1 }如果你确定不用 warnings，你可以限制它的使用范围，如：</p>
<p># 把这段代码:<br />
sub add_two_numbers_which_might_be_undef {<br />
$_[0] + $_[1];<br />
}</p>
<p># 根据Perl 的版本不同改成下面的样子:<br />
# 1<br />
sub add_two_numbers_which_might_be_undef {<br />
# 参见 &#8216;perldoc perllexwarn&#8217;<br />
# 因为最好是只在你希望的地方禁止掉warning<br />
no warnings &#8220;uninitialized&#8221;;<br />
$_[0] + $_[1];<br />
}</p>
<p># 2<br />
sub add_two_numbers_which_might_be_undef {<br />
local $^W;<br />
$_[0] + $_[1];<br />
}</p>
<p>或者，你应像前面例子中声明 &#8216;$number&#8217;一样初始化变量。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9204.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

