<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="Magike 1.1.1 Release" -->
<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/">
<channel>



<title><![CDATA[NeiLyi.cn]]></title>
<link>http://www.neilyi.cn</link>
<description>尼尔易的生活,尼尔易的世界,记录自己的点点滴滴,PHP,JS,jQuery等技术交流,提供清析,无广告版网络电视在线收看(PPS,PPStream,PPLive),呵呵从此看体育直播,无需担心烦人的广告以及病毒了</description>
<language>zh-cn-utf8</language>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>Magike 1.1.1 Release</generator>
<webMaster></webMaster>
<item>
<title><![CDATA[让进程在后台可靠运行的几种方法(很受用)]]></title>
<link>http://www.neilyi.cn/archives/RangJinChengZaiHouTaiKeKaoYunXingDeJiZhongFangFa-HenShouYong.html</link>
<comments>http://www.neilyi.cn/archives/RangJinChengZaiHouTaiKeKaoYunXingDeJiZhongFangFa-HenShouYong.html#comments</comments>
<category><![CDATA[Freebsd/unix/linux]]></category>
<guid>http://www.neilyi.cn/archives/RangJinChengZaiHouTaiKeKaoYunXingDeJiZhongFangFa-HenShouYong.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Mon, 30 Aug 2010 03:12:38 -0700</pubDate>
<description><![CDATA[http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

想让进程在断开连接后依然保持运行？如果该进程已经开始运行了该如何补救？ 如果有大量这类需...]]></description>
<content:encoded><![CDATA[<p>http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/</p><p>想让进程在断开连接后依然保持运行？如果该进程已经开始运行了该如何补救？ 如果有大量这类需求如何简化操作？<br />我们经常会碰到这样的问题，用 telnet/ssh 登录了远程的 Linux 服务器，运行了一些耗时较长的任务， 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢？下面举了一些例子， 您可以针对不同的场景选择不同的方式来处理这个问题。</p><p>nohup/setsid/&</p><p>场景：</p><p>如果只是临时有一个命令需要长时间运行，什么方法能最简便的保证它在后台稳定运行呢？</p><p>hangup 名称的来由<br />在 Unix 的早期版本中，每个终端都会通过 modem 和系统通讯。当用户 logout 时，modem 就会挂断（hang up）电话。 同理，当 modem 断开连接时，就会给终端发送 hangup 信号来通知其关闭所有子进程。  <br /> <br />解决方法：</p><p>我们知道，当用户注销（logout）或者网络断开时，终端会收到 HUP（hangup）信号从而关闭其所有子进程。因此，我们的解决办法就有两种途径：要么让进程忽略 HUP 信号，要么让进程运行在新的会话里从而成为不属于此终端的子进程。</p><p>1. nohup <br />nohup 无疑是我们首先想到的办法。顾名思义，nohup 的用途就是让提交的命令忽略 hangup 信号。让我们先来看一下 nohup 的帮助信息：</p><p>NOHUP(1)                        User Commands                        NOHUP(1)</p><p>NAME<br />       nohup - run a command immune to hangups, with output to a non-tty</p><p>SYNOPSIS<br />       nohup COMMAND [ARG]...<br />       nohup OPTION</p><p>DESCRIPTION<br />       Run COMMAND, ignoring hangup signals.</p><p>--help display this help and exit</p><p>--version<br />              output version information and exit</p><p>可见，nohup 的使用是十分方便的，只需在要处理的命令前加上 nohup 即可，标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行，也可用">filename 2>&1"来更改缺省的重定向文件名。</p><p>nohup 示例<br />                <br />[root@pvcent107 ~]# nohup ping www.ibm.com &<br />[1] 3059<br />nohup: appending output to `nohup.out'<br />[root@pvcent107 ~]# ps -ef |grep 3059<br />root      3059   984  0 21:06 pts/3    00:00:00 ping www.ibm.com<br />root      3067   984  0 21:06 pts/3    00:00:00 grep 3059<br />[root@pvcent107 ~]#</p><p>2。setsid <br />nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断，但如果我们换个角度思考，如果我们的进程不属于接受 HUP 信号的终端的子进程，那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。让我们先来看一下 setsid 的帮助信息：</p><p>SETSID(8)                 Linux Programmer’s Manual                 SETSID(8)</p><p>NAME<br />       setsid - run a program in a new session</p><p>SYNOPSIS<br />       setsid program [ arg ... ]</p><p>DESCRIPTION<br />       setsid runs a program in a new session.</p><p>可见 setsid 的使用也是非常方便的，也只需在要处理的命令前加上 setsid 即可。</p><p>setsid 示例<br />                <br />[root@pvcent107 ~]# setsid ping www.ibm.com<br />[root@pvcent107 ~]# ps -ef |grep www.ibm.com<br />root     31094     1  0 07:28 ?        00:00:00 ping www.ibm.com<br />root     31102 29217  0 07:29 pts/4    00:00:00 grep www.ibm.com<br />[root@pvcent107 ~]#</p><p>值得注意的是，上例中我们的进程 ID(PID)为31094，而它的父 ID（PPID）为1（即为 init 进程 ID），并不是当前终端的进程 ID。请将此例与nohup 例中的父 ID 做比较。</p><p>3。& <br />这里还有一个关于 subshell 的小技巧。我们知道，将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中，从而扩展出很多有趣的功能，我们现在要讨论的就是其中之一。</p><p>当我们将"&"也放入“()”内之后，我们就会发现所提交的作业并不在作业列表中，也就是说，是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。</p><p>subshell 示例<br />                <br />[root@pvcent107 ~]# (ping www.ibm.com &)<br />[root@pvcent107 ~]# ps -ef |grep www.ibm.com<br />root     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.com<br />root     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com<br />[root@pvcent107 ~]#</p><p>从上例中可以看出，新提交的进程的父 ID（PPID）为1（init 进程的 PID），并不是当前终端的进程 ID。因此并不属于当前终端的子进程，从而也就不会受到当前终端的 HUP 信号的影响了。</p><p>回页首</p><p>disown</p><p>场景：</p><p>我们已经知道，如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。但是如果我们未加任何处理就已经提交了命令，该如何补救才能让它避免 HUP 信号的影响呢？</p><p>解决方法：</p><p>这时想加 nohup 或者 setsid 已经为时已晚，只能通过作业调度和 disown 来解决这个问题了。让我们来看一下 disown 的帮助信息：</p><p>disown [-ar] [-h] [jobspec ...]<br />	Without options, each jobspec is  removed  from  the  table  of<br />	active  jobs.   If  the -h option is given, each jobspec is not<br />	removed from the table, but is marked so  that  SIGHUP  is  not<br />	sent  to the job if the shell receives a SIGHUP.  If no jobspec<br />	is present, and neither the -a nor the -r option  is  supplied,<br />	the  current  job  is  used.  If no jobspec is supplied, the -a<br />	option means to remove or mark all jobs; the -r option  without<br />	a  jobspec  argument  restricts operation to running jobs.  The<br />	return value is 0 unless a jobspec does  not  specify  a  valid<br />	job.</p><p>可以看出，我们可以用如下方式来达成我们的目的。</p><p>灵活运用 CTRL-z<br />在我们的日常工作中，我们可以用 CTRL-z 来将当前进程挂起到后台暂停运行，执行一些别的操作，然后再用 fg 来将挂起的进程重新放回前台（也可用 bg 来将挂起的进程放在后台）继续运行。这样我们就可以在一个终端内灵活切换运行多个任务，这一点在调试代码时尤为有用。因为将代码编辑器挂起到后台再重新放回时，光标定位仍然停留在上次挂起时的位置，避免了重新定位的麻烦。  <br /> <br />用disown -h jobspec 来使某个作业忽略HUP信号。 <br />用disown -ah 来使所有的作业都忽略HUP信号。 <br />用disown -rh 来使正在运行的作业忽略HUP信号。 <br />需要注意的是，当使用过 disown 之后，会将把目标作业从作业列表中移除，我们将不能再使用jobs来查看它，但是依然能够用ps -ef查找到它。</p><p>但是还有一个问题，这种方法的操作对象是作业，如果我们在运行命令时在结尾加了"&"来使它成为一个作业并在后台运行，那么就万事大吉了，我们可以通过jobs命令来得到所有作业的列表。但是如果并没有把当前命令作为作业来运行，如何才能得到它的作业号呢？答案就是用 CTRL-z（按住Ctrl键的同时按住z键）了！</p><p>CTRL-z 的用途就是将当前进程挂起（Suspend），然后我们就可以用jobs命令来查询它的作业号，再用bg jobspec 来将它放入后台并继续运行。需要注意的是，如果挂起会影响当前进程的运行结果，请慎用此方法。</p><p>disown 示例1（如果提交命令时已经用“&”将命令放入后台运行，则可以直接使用“disown”）<br />                <br />[root@pvcent107 build]# cp -r testLargeFile largeFile &<br />[1] 4825<br />[root@pvcent107 build]# jobs<br />[1]+  Running                 cp -i -r testLargeFile largeFile &<br />[root@pvcent107 build]# disown -h %1<br />[root@pvcent107 build]# ps -ef |grep largeFile<br />root      4825   968  1 09:46 pts/4    00:00:00 cp -i -r testLargeFile largeFile<br />root      4853   968  0 09:46 pts/4    00:00:00 grep largeFile<br />[root@pvcent107 build]# logout</p><p>disown 示例2（如果提交命令时未使用“&”将命令放入后台运行，可使用 CTRL-z 和“bg”将其放入后台，再使用“disown”）<br />                <br />[root@pvcent107 build]# cp -r testLargeFile largeFile2</p><p>[1]+  Stopped                 cp -i -r testLargeFile largeFile2<br />[root@pvcent107 build]# bg %1<br />[1]+ cp -i -r testLargeFile largeFile2 &<br />[root@pvcent107 build]# jobs<br />[1]+  Running                 cp -i -r testLargeFile largeFile2 &<br />[root@pvcent107 build]# disown -h %1<br />[root@pvcent107 build]# ps -ef |grep largeFile2<br />root      5790  5577  1 10:04 pts/3    00:00:00 cp -i -r testLargeFile largeFile2<br />root      5824  5577  0 10:05 pts/3    00:00:00 grep largeFile2<br />[root@pvcent107 build]#</p><p>回页首</p><p>screen</p><p>场景：</p><p>我们已经知道了如何让进程免受 HUP 信号的影响，但是如果有大量这种命令需要在稳定的后台里运行，如何避免对每条命令都做这样的操作呢？</p><p>解决方法：</p><p>此时最方便的方法就是 screen 了。简单的说，screen 提供了 ANSI/VT100 的终端模拟器，使它能够在一个真实终端下运行多个全屏的伪终端。screen 的参数很多，具有很强大的功能，我们在此仅介绍其常用功能以及简要分析一下为什么使用 screen 能够避免 HUP 信号的影响。我们先看一下 screen 的帮助信息：</p><p>SCREEN(1)                                                           SCREEN(1)</p><p>NAME<br />       screen - screen manager with VT100/ANSI terminal emulation</p><p>SYNOPSIS<br />       screen [ -options ] [ cmd [ args ] ]<br />       screen -r [[pid.]tty[.host]]<br />       screen -r sessionowner/[[pid.]tty[.host]]</p><p>DESCRIPTION<br />       Screen  is  a  full-screen  window manager that multiplexes a physical<br />       terminal between several  processes  (typically  interactive  shells).<br />       Each  virtual  terminal provides the functions of a DEC VT100 terminal<br />       and, in addition, several control functions from the  ISO  6429  (ECMA<br />       48,  ANSI  X3.64)  and ISO 2022 standards (e.g. insert/delete line and<br />       support for multiple character sets).  There is a  scrollback  history<br />       buffer  for  each virtual terminal and a copy-and-paste mechanism that<br />       allows moving text regions between windows.</p><p>使用 screen 很方便，有以下几个常用选项：</p><p>用screen -dmS session name 来建立一个处于断开模式下的会话（并指定其会话名）。 <br />用screen -list 来列出所有会话。 <br />用screen -r session name 来重新连接指定会话。 <br />用快捷键CTRL-a d 来暂时断开当前会话。</p><p>screen 示例<br />                <br />[root@pvcent107 ~]# screen -dmS Urumchi<br />[root@pvcent107 ~]# screen -list<br />There is a screen on:<br />        12842.Urumchi   (Detached)<br />1 Socket in /tmp/screens/S-root.</p><p>[root@pvcent107 ~]# screen -r Urumchi</p><p>当我们用“-r”连接到 screen 会话后，我们就可以在这个伪终端里面为所欲为，再也不用担心 HUP 信号会对我们的进程造成影响，也不用给每个命令前都加上“nohup”或者“setsid”了。这是为什么呢？让我来看一下下面两个例子吧。</p><p>1. 未使用 screen 时新进程的进程树<br />                <br />[root@pvcent107 ~]# ping www.google.com &<br />[1] 9499<br />[root@pvcent107 ~]# pstree -H 9499<br />init─┬─Xvnc<br />     ├─acpid<br />     ├─atd<br />     ├─2*[sendmail]	<br />     ├─sshd─┬─sshd───bash───pstree<br />     │       └─sshd───bash───ping</p><p>我们可以看出，未使用 screen 时我们所处的 bash 是 sshd 的子进程，当 ssh 断开连接时，HUP 信号自然会影响到它下面的所有子进程（包括我们新建立的 ping 进程）。</p><p>2. 使用了 screen 后新进程的进程树<br />                <br />[root@pvcent107 ~]# screen -r Urumchi<br />[root@pvcent107 ~]# ping www.ibm.com &<br />[1] 9488<br />[root@pvcent107 ~]# pstree -H 9488<br />init─┬─Xvnc<br />     ├─acpid<br />     ├─atd<br />     ├─screen───bash───ping<br />     ├─2*[sendmail]</p><p>而使用了 screen 后就不同了，此时 bash 是 screen 的子进程，而 screen 是 init（PID为1）的子进程。那么当 ssh 断开连接时，HUP 信号自然不会影响到 screen 下面的子进程了。</p><p>回页首</p><p>总结</p><p>现在几种方法已经介绍完毕，我们可以根据不同的场景来选择不同的方案。nohup/setsid 无疑是临时需要时最方便的方法，disown 能帮助我们来事后补救当前已经在运行了的作业，而 screen 则是在大批量操作时不二的选择了。</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/RangJinChengZaiHouTaiKeKaoYunXingDeJiZhongFangFa-HenShouYong.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[perl 计算硬盘利用率]]></title>
<link>http://www.neilyi.cn/archives/perl-JiSuanYingPanLiYongLu.html</link>
<comments>http://www.neilyi.cn/archives/perl-JiSuanYingPanLiYongLu.html#comments</comments>
<category><![CDATA[技术安全]]></category>
<guid>http://www.neilyi.cn/archives/perl-JiSuanYingPanLiYongLu.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Mon, 30 Aug 2010 02:56:39 -0700</pubDate>
<description><![CDATA[perl 计算硬盘利用率， 以%来查看硬盘资源是否存在IO消耗cpu资源情况；

部份代码参考了iostat源码；

#!/usr/bin/perl
use Time::HiRes qw(gettim...]]></description>
<content:encoded><![CDATA[<p>perl 计算硬盘利用率， 以%来查看硬盘资源是否存在IO消耗cpu资源情况；</p><p>部份代码参考了iostat源码；</p><p>#!/usr/bin/perl<br />use Time::HiRes qw(gettimeofday);<br />use POSIX;</p><p>$SLEEPTIME=3;<br />sub getDiskUtl()<br />{<br />$clock_ticks = POSIX::sysconf( &POSIX::_SC_CLK_TCK );</p><p># ========= get start time ===============<br />($start_sec, $start_usec) = gettimeofday;</p><p># ========== 在计时开始时，取出操作时间<br />my $tot_ticks_0 = `grep "0 sda" /proc/diskstats | awk '{print \$13}'`;</p><p>sleep($SLEEPTIME);<br />#for(1..$SLEEPTIME*1000000){}</p><p># ========= get end time ===============<br />($end_sec, $end_usec) = gettimeofday;</p><p># ========== 在计时结束时，再取出一次操作时间<br />my $tot_ticks_1 = `grep "0 sda" /proc/diskstats | awk '{print \$13}'`;</p><p>if ($end_usec < $start_usec) <br />{<br />    $time_used = (($end_sec - $start_sec - 1)*1e6 + ($end_usec+1e6 - $start_usec)) / 1e3; # Microseconds = Millisecond * 10e3;<br />}<br />else<br />{<br />    $time_used = (($end_sec - $start_sec)*1e6 + ($end_usec - $start_usec)) / 1e3; # Microseconds = Millisecond * 1e3<br />}</p><p>my $disk_util = ($tot_ticks_1 - $tot_ticks_0)/$time_used*$clock_ticks/10.0;<br />}<br />#printf("\$start_sec is:$start_sec\t \$end_sec is:$end_sec\t\$end_usec is:$end_usec\t\$start_usec is:$start_usec\n");</p><p>#printf("\$tot_ticks_1 is %d\t\$tot_ticks_0 is %d \t\$time_used is %d\t\$clock_ticks is %d\n",<br />#       $tot_ticks_1, $tot_ticks_0, $time_used, $clock_ticks);<br />printf("%8.8f\%\n", getDiskUtl());</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/perl-JiSuanYingPanLiYongLu.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[Perl计算cpu使用率方法]]></title>
<link>http://www.neilyi.cn/archives/PerlJiSuancpuShiYongLuFangFa.html</link>
<comments>http://www.neilyi.cn/archives/PerlJiSuancpuShiYongLuFangFa.html#comments</comments>
<category><![CDATA[技术安全]]></category>
<guid>http://www.neilyi.cn/archives/PerlJiSuancpuShiYongLuFangFa.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Mon, 30 Aug 2010 02:53:35 -0700</pubDate>
<description><![CDATA[1、先了解/proc/stat文件信息

在Linux/Unix下，CPU利用率分为用户态，系统态和空闲态，分别表示CPU处于用户态执行的时间，系统内核执行的时间，和空闲系统进程执行的时间。平时所说的...]]></description>
<content:encoded><![CDATA[<p>1、先了解/proc/stat文件信息</p><p>在Linux/Unix下，CPU利用率分为用户态，系统态和空闲态，分别表示CPU处于用户态执行的时间，系统内核执行的时间，和空闲系统进程执行的时间。平时所说的CPU利用率是指：CPU执行非系统空闲进程的时间 / CPU总的执行时间。</p><p>此信息都存储在/proc/stat文件中，</p><p>在Linux的内核中，有一个全局变量：Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ，代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒，这就是系统所能分辨的最小时间间隔了。每个CPU时间片，Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。</p><p>在Linux系统中，可以用/proc/stat文件来计算cpu的利用率。这个文件包含了所有CPU活动的信息，该文件中的所有值都是从系统启动开始累计到当前时刻。样例如下：</p><p>[root@bogon tmp]# cat /proc/stat <br />cpu  2175 501 15724 1114163 7094 2153 1144 0<br />cpu0 2175 501 15724 1114163 7094 2153 1144 0<br />intr 11576005 11430258 11 0 3 3 0 5 0 1 0 0 0 107 0 0 111811 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5461 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28345 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />ctxt 530531<br />btime 1228361375<br />processes 6764<br />procs_running 1<br />procs_blocked 0</p><p>输出解释<br />CPU 以及CPU0、CPU1每行的每个参数意思（以第一行为例）为：</p><p>参数 解释<br />user (432661) 从系统启动开始累计到当前时刻，用户态的CPU时间（单位：jiffies） ，不包含 nice值为负进程。1jiffies=0.01秒<br />nice (13295) 从系统启动开始累计到当前时刻，nice值为负的进程所占用的CPU时间（单位：jiffies）<br />system (86656) 从系统启动开始累计到当前时刻，核心时间（单位：jiffies）<br />idle (422145968) 从系统启动开始累计到当前时刻，除硬盘IO等待时间以外其它等待时间（单位：jiffies）<br />iowait (171474) 从系统启动开始累计到当前时刻，硬盘IO等待时间（单位：jiffies） ，<br />irq (233) 从系统启动开始累计到当前时刻，硬中断时间（单位：jiffies）<br />softirq (5346) 从系统启动开始累计到当前时刻，软中断时间（单位：jiffies）</p><p>CPU时间=user+system+nice+idle+iowait+irq+softirq</p><p>“intr”这行给出中断的信息，第一个为自系统启动以来，发生的所有的中断的次数；然后每个数对应一个特定的中断自系统启动以来所发生的次数。<br />“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。<br />“btime”给出了从系统启动到现在为止的时间，单位为秒。<br />“processes (total_forks) 自系统启动以来所创建的任务的个数目。<br />“procs_running”：当前运行队列的任务的数目。<br />“procs_blocked”：当前被阻塞的任务的数目。</p><p>那么CPU利用率可以使用以下两个方法。先取两个采样点，然后计算其差值：</p><p>1、先了解/proc/stat文件信息</p><p>在Linux/Unix下，CPU利用率分为用户态，系统态和空闲态，分别表示CPU处于用户态执行的时间，系统内核执行的时间，和空闲系统进程执行的时间。平时所说的CPU利用率是指：CPU执行非系统空闲进程的时间 / CPU总的执行时间。</p><p>此信息都存储在/proc/stat文件中，</p><p>在Linux的内核中，有一个全局变量：Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ，代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒，这就是系统所能分辨的最小时间间隔了。每个CPU时间片，Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。</p><p>在Linux系统中，可以用/proc/stat文件来计算cpu的利用率。这个文件包含了所有CPU活动的信息，该文件中的所有值都是从系统启动开始累计到当前时刻。样例如下：</p><p>[root@bogon tmp]# cat /proc/stat <br />cpu  2175 501 15724 1114163 7094 2153 1144 0<br />cpu0 2175 501 15724 1114163 7094 2153 1144 0<br />intr 11576005 11430258 11 0 3 3 0 5 0 1 0 0 0 107 0 0 111811 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5461 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28345 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />ctxt 530531<br />btime 1228361375<br />processes 6764<br />procs_running 1<br />procs_blocked 0</p><p>输出解释<br />CPU 以及CPU0、CPU1每行的每个参数意思（以第一行为例）为：</p><p>参数 解释<br />user (432661) 从系统启动开始累计到当前时刻，用户态的CPU时间（单位：jiffies） ，不包含 nice值为负进程。1jiffies=0.01秒<br />nice (13295) 从系统启动开始累计到当前时刻，nice值为负的进程所占用的CPU时间（单位：jiffies）<br />system (86656) 从系统启动开始累计到当前时刻，核心时间（单位：jiffies）<br />idle (422145968) 从系统启动开始累计到当前时刻，除硬盘IO等待时间以外其它等待时间（单位：jiffies）<br />iowait (171474) 从系统启动开始累计到当前时刻，硬盘IO等待时间（单位：jiffies） ，<br />irq (233) 从系统启动开始累计到当前时刻，硬中断时间（单位：jiffies）<br />softirq (5346) 从系统启动开始累计到当前时刻，软中断时间（单位：jiffies）</p><p>CPU时间=user+system+nice+idle+iowait+irq+softirq</p><p>“intr”这行给出中断的信息，第一个为自系统启动以来，发生的所有的中断的次数；然后每个数对应一个特定的中断自系统启动以来所发生的次数。<br />“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。<br />“btime”给出了从系统启动到现在为止的时间，单位为秒。<br />“processes (total_forks) 自系统启动以来所创建的任务的个数目。<br />“procs_running”：当前运行队列的任务的数目。<br />“procs_blocked”：当前被阻塞的任务的数目。</p><p>那么CPU利用率可以使用以下两个方法。先取两个采样点，然后计算其差值：</p><p>2、实例代码</p><p>#!/usr/bin/perl<br />use warnings;<br /> <br />#################################################<br /># 统计cpu使用率,每5秒统一次<br /># parameter : nothing<br /># return    : $SYS_USAGE   # 系统cpu总使用率<br />#################################################<br />sub GETCPUPERCENTER<br />{<br />  $SLEEPTIME=5;<br />   <br />  if (-e "/tmp/stat") {<br />    unlink "/tmp/stat";<br />  }<br />  open (JIFF_TMP, ">>/tmp/stat") || die "Can't open /proc/stat file!\t$!\n";<br />  open (JIFF, "/proc/stat") || die "Can't open /proc/stat file!\t$!\n";<br />  @jiff_0=<JIFF>;<br />  print JIFF_TMP $jiff_0[0] ;<br />  close (JIFF);<br />   <br />  sleep $SLEEPTIME;<br />   <br />  open (JIFF, "/proc/stat") || die "Can't open /proc/stat file!\t$!\n";<br />  @jiff_1=<JIFF>;<br />  print JIFF_TMP $jiff_1[0];<br />  close (JIFF);<br />  close (JIFF_TMP);<br />   <br />  @USER    = `awk '{print \$2}' "/tmp/stat"`;<br />  @NICE    = `awk '{print \$3}' "/tmp/stat"`;<br />  @SYSTEM  = `awk '{print \$4}' "/tmp/stat"`;<br />  @IDLE    = `awk '{print \$5}' "/tmp/stat"`;<br />  @IOWAIT  = `awk '{print \$6}' "/tmp/stat"`;<br />  @IRQ     = `awk '{print \$7}' "/tmp/stat"`;<br />  @SOFTIRQ = `awk '{print \$8}' "/tmp/stat"`;<br />   <br />  $JIFF_0=$USER[0]+$NICE[0]+$SYSTEM[0]+$IDLE[0]+$IOWAIT[0]+$IRQ[0]+$SOFTIRQ[0];<br />  $JIFF_1=$USER[1]+$NICE[1]+$SYSTEM[1]+$IDLE[1]+$IOWAIT[1]+$IRQ[1]+$SOFTIRQ[1];<br />   <br />  $SYS_IDLE=($IDLE[0]-$IDLE[1]) / ($JIFF_0-$JIFF_1) * 100;<br />  $SYS_USAGE=100 - $SYS_IDLE;<br />  return $SYS_USAGE;<br />}</p><p>my $cpu_used=GETCPUPERCENTER();</p><p>print " $cpu_used: $cpu_used \n";</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/PerlJiSuancpuShiYongLuFangFa.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[vnc的默认端口修改]]></title>
<link>http://www.neilyi.cn/archives/vncDeMoRenDuanKouXiuGai.html</link>
<comments>http://www.neilyi.cn/archives/vncDeMoRenDuanKouXiuGai.html#comments</comments>
<category><![CDATA[客户端技术]]></category>
<guid>http://www.neilyi.cn/archives/vncDeMoRenDuanKouXiuGai.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Thu, 26 Aug 2010 18:55:06 -0700</pubDate>
<description><![CDATA[vnc的默认端口是5901，这个说法是不对的。vnc并不是只有一个端口。

以前另一个文章介绍了nvcserver的配置用户的过程，里面提到了桌面号，这个桌面号就可以端口有密切关系

先看看这个配置
...]]></description>
<content:encoded><![CDATA[<p>vnc的默认端口是5901，这个说法是不对的。vnc并不是只有一个端口。</p><p>以前另一个文章介绍了nvcserver的配置用户的过程，里面提到了桌面号，这个桌面号就可以端口有密切关系</p><p>先看看这个配置 <br />VNCSERVERS="1:oracle 2:root" <br />VNCSERVERARGS[1]="-geometry 800x600 -nolisten tcp -nohttpd" <br />...... <br />这里是摘自/etc/sysconfig/vncservers里的一段。 这里就配置了2个桌面，一个桌面号是1， 一个是2.</p><p>vncserver在调用的时候，会根据你的配置来启用server端的监听端口， 从5900开始，加上你的桌面号，比如这里的哦oracle就是5901，root就是5902</p><p>所以通过这里的桌面号也是可以达到我们的目的的,根据你的目标端口来设定用户的周面好，虽然可以解决，但是总是感觉有些没有拉干净的感觉，这不是这次的研究内容，还是找个痛快的方式吧。</p><p>这次的研究主要就是颠覆这样的默认规则，直接的深入进去，我要直接修改5900+为15900+</p><p>在网上没有找到比较好的方法和文档，自己动手吧</p><p>从vncserver这个启动命令开始吧， <br />[root@redflag1 ~]# which vncserver <br />/usr/bin/vncserver</p><p>[root@redflag1 ~]# file /usr/bin/vncserver <br />/usr/bin/vncserver: a perl script text executable</p><p>[root@redflag1 ~]# grep "59" /usr/bin/vncserver -n <br />18:# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, <br />118:$vncPort = 5900 + $displayNumber; <br />238:# n is taken if something is listening on the VNC server port (5900+n) or the <br />257:# (5900+n) or the X server port (6000+n). <br />274: if (!bind(S, pack('S n x12', $AF_INET, 5900 + $n))) {</p><p>经过这几个回合，解决方法已经大白于天下了。</p><p>这里启动的脚本hard code了5900，我们可以替换这里就OK了</p><p>先定义一个$default_port=15900 <br />然后替换118和274行的5900为$default_port就可以了</p><p>现在启动服务 <br />[root@redflag1 ~]# service vncserver restart</p><p>查看端口 <br />[root@redflag1 ~]# netstat -l | grep 159 <br />tcp 0 0 *:15901 *:* LISTEN <br />tcp 0 0 *:15902 *:* LISTEN</p><p>已经成功了。用vncviewer链接一下。可以了。</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/vncDeMoRenDuanKouXiuGai.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[vmware server安装]]></title>
<link>http://www.neilyi.cn/archives/vmware-serverAnZhuang.html</link>
<comments>http://www.neilyi.cn/archives/vmware-serverAnZhuang.html#comments</comments>
<category><![CDATA[客户端技术]]></category>
<guid>http://www.neilyi.cn/archives/vmware-serverAnZhuang.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Wed, 25 Aug 2010 03:12:24 -0700</pubDate>
<description><![CDATA[为了满足开机自己启动以及用户注销后，虚拟机仍然运行，选择了vmware server

目前版本： vmware server2.0

异常： mis错误。网上说是由于安装包过大（500M+），win...]]></description>
<content:encoded><![CDATA[<p>为了满足开机自己启动以及用户注销后，虚拟机仍然运行，选择了vmware server</p><p>目前版本： vmware server2.0</p><p>异常： mis错误。网上说是由于安装包过大（500M+），windows系统默认安全策略有问题。<br />    解决方法： 控制面板--》管理工具--》软件限制策略。 （添加一项，选择管理员除外）</p><p>另欣赏的是vmware servere2.0的web管理系统的功能（当然也是有限的）。</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/vmware-serverAnZhuang.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[Zend studio5.5在win7下无法启动的解决方法]]></title>
<link>http://www.neilyi.cn/archives/Zend-studio5-5Zaiwin7XiaWuFaQiDongDeJieJueFangFa.html</link>
<comments>http://www.neilyi.cn/archives/Zend-studio5-5Zaiwin7XiaWuFaQiDongDeJieJueFangFa.html#comments</comments>
<category><![CDATA[PHP]]></category>
<guid>http://www.neilyi.cn/archives/Zend-studio5-5Zaiwin7XiaWuFaQiDongDeJieJueFangFa.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Sat, 21 Aug 2010 18:12:03 -0700</pubDate>
<description><![CDATA[右键->选择兼容性 ->vista

另外： 暂时放弃Zend studio8.0 发现ftp功能不是很好。]]></description>
<content:encoded><![CDATA[<p>右键->选择兼容性 ->vista</p><p>另外： 暂时放弃Zend studio8.0 发现ftp功能不是很好。</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/Zend-studio5-5Zaiwin7XiaWuFaQiDongDeJieJueFangFa.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[万网G享主机URL重写]]></title>
<link>http://www.neilyi.cn/archives/WanWangGXiangZhuJiURLZhongXie.html</link>
<comments>http://www.neilyi.cn/archives/WanWangGXiangZhuJiURLZhongXie.html#comments</comments>
<category><![CDATA[PHP]]></category>
<guid>http://www.neilyi.cn/archives/WanWangGXiangZhuJiURLZhongXie.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Mon, 16 Aug 2010 00:41:42 -0700</pubDate>
<description><![CDATA[应工作需求，需要在万网G享主机上做URL重写。

1， 首先万网问题帮助中心有手册 （实为装字母二，误导人的，只有最基本的介绍，根本满足不了需求。其实就是iis7的URL Rewrite Module...]]></description>
<content:encoded><![CDATA[<p>应工作需求，需要在万网G享主机上做URL重写。</p><p>1， 首先万网问题帮助中心有手册 （实为装字母二，误导人的，只有最基本的介绍，根本满足不了需求。其实就是iis7的URL Rewrite Module 2.0） 见： http://learn.iis.net/page.aspx/665/url-rewrite-module-20-configuration-reference/</p><p>2. 配置如下：</p><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?xml&nbsp;version</span><span style="color: #007700">=</span><span style="color: #DD0000">"1.0"&nbsp;</span><span style="color: #0000BB">encoding</span><span style="color: #007700">=</span><span style="color: #DD0000">"UTF-8"</span><span style="color: #0000BB">?&gt;<br /></span>&lt;configuration&gt;<br />&lt;system.webServer&gt;<br />&lt;rewrite&gt;<br />&lt;rules&gt;<br />&lt;rule&nbsp;name="rule1"&nbsp;stopProcessing="true"&gt;<br />&lt;match&nbsp;url="^$"&nbsp;/&gt;<br />&lt;conditions&nbsp;logicalGrouping="MatchAll"&gt;<br />&lt;add&nbsp;input="{HTTP_HOST}"&nbsp;pattern="^cn.xxx.com$"&nbsp;/&gt;<br />&lt;/conditions&gt;<br />&lt;action&nbsp;type="Rewrite"&nbsp;url="/newweb/cn/index.asp"&nbsp;/&gt;<br />&lt;/rule&gt;<br /><br />&lt;rule&nbsp;name="rule2"&nbsp;stopProcessing="true"&gt;<br />&lt;match&nbsp;url="(.+)"&nbsp;/&gt;<br />&lt;conditions&nbsp;logicalGrouping="MatchAll"&gt;<br />&lt;add&nbsp;input="{HTTP_HOST}"&nbsp;pattern="^cn.xxx.com$"&nbsp;/&gt;<br />&lt;/conditions&gt;<br />&lt;action&nbsp;type="Rewrite"&nbsp;url="/newweb/cn/{R:1}"&nbsp;/&gt;<br />&lt;/rule&gt;<br /><br />&lt;/rules&gt;<br />&lt;/rewrite&gt;<br />&lt;/system.webServer&gt;<br />&lt;/configuration&gt;</span>
</code><p>注： conditions增加约束条件。</p><code><span style="color: #000000">
&lt;match&nbsp;url="(.+)"&nbsp;/&gt;</span>
</code><p>中url不带域名和端口。如 http://cn.xxx.com:82/bb/a.asp,url中为 bb/a.asp</p><p>另，ilterByTags过滤</p><code><span style="color: #000000">
&lt;outboundRules&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;rule&nbsp;name="Add&nbsp;application&nbsp;prefix"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;match&nbsp;filterByTags="A,Img,Script,Link"&nbsp;pattern="^/(.*)"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;conditions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add&nbsp;input="{URL}"&nbsp;pattern="^/leven/.*"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/conditions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;action&nbsp;type="Rewrite"&nbsp;value="/leven/{R:1}"&nbsp;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/rule&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/outboundRules&gt;</span>
</code>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/WanWangGXiangZhuJiURLZhongXie.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[joe编辑器]]></title>
<link>http://www.neilyi.cn/archives/joeBianJiQi.html</link>
<comments>http://www.neilyi.cn/archives/joeBianJiQi.html#comments</comments>
<category><![CDATA[客户端技术]]></category>
<guid>http://www.neilyi.cn/archives/joeBianJiQi.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Wed, 04 Aug 2010 23:02:01 -0700</pubDate>
<description><![CDATA[下载地址： http://sourceforge.net/projects/joe-editor/files/JOE%20sources/joe-3.7/joe-3.7.tar.gz/download...]]></description>
<content:encoded><![CDATA[<p>下载地址： http://sourceforge.net/projects/joe-editor/files/JOE%20sources/joe-3.7/joe-3.7.tar.gz/download   （3.7版）</p><p>简、清、爽</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/joeBianJiQi.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[php JPGRAPH]]></title>
<link>http://www.neilyi.cn/archives/php-JPGRAPH-2010730102240.html</link>
<comments>http://www.neilyi.cn/archives/php-JPGRAPH-2010730102240.html#comments</comments>
<category><![CDATA[PHP]]></category>
<guid>http://www.neilyi.cn/archives/php-JPGRAPH-2010730102240.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Fri, 30 Jul 2010 03:22:40 -0700</pubDate>
<description><![CDATA[//设置图列的数据

$bplot1 = new BarPlot($datay1);

$bplot2 = new BarPlot($datay2);

//设置图列的填充颜色

$bplot1->S...]]></description>
<content:encoded><![CDATA[<p>//设置图列的数据</p><p>$bplot1 = new BarPlot($datay1);</p><p>$bplot2 = new BarPlot($datay2);</p><p>//设置图列的填充颜色</p><p>$bplot1->SetFillColor('orange@0.4');</p><p>$bplot2->SetFillColor('brown@0.4');</p><p>设置值的格式</p><p>$bplot1->value->SetFormat('%d');</p><p>//设置图列标签</p><p>$bplot1->SetLegend('Label 1');</p><p>$bplot2->SetLegend('Label 2');</p><p>//设置图列在图中的阴影</p><p>$bplot1->SetShadow('black@0.4');</p><p>$bplot2->SetShadow('black@0.4');</p><p>//生成图列</p><p>$gbarplot = new GroupBarPlot(array($bplot1,$bplot2));</p><p>$gbarplot->SetWidth(0.9);</p><p>$graph->Add($gbarplot);</p><p>//生成图形</p><p>$graph->Stroke();</p><p>//上面所说的时在生成柱形图，当生成线性图时用下面的方法</p><p>$p1 = new LinePlot($datay);</p><p>$p1->mark->SetType(MARK_FILLEDCIRCLE);</p><p>$p1->mark->SetFillColor("red");</p><p>$p1->mark->SetWidth(4);</p><p>$p1->SetColor("blue");</p><p>$p1->SetCenter();</p><p>$p1->SetLegend("Triumph Tiger -98");</p><p>$graph->Add($p1);</p><p>$p2 = new LinePlot($data2y);</p><p>$p2->mark->SetType(MARK_STAR);</p><p>$p2->mark->SetFillColor("red");</p><p>$p2->mark->SetWidth(4);</p><p>$p2->SetColor("red");</p><p>$p2->SetCenter();</p><p>$p2->SetLegend("New tiger -99");</p><p>$graph->Add($p2);</p><p>// Style can also be specified as SetStyle([1|2|3|4]) or <br />// SetStyle("solid"|"dotted"|"dashed"|"lobgdashed") <br />$lineplot->SetStyle("dashed");//设置线的样式</p><p>$graph->yaxis->scale->SetGrace(20);  //设置y轴更优美一些</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/php-JPGRAPH-2010730102240.html/feed/</wfw:commentRss>
</item>
<item>
<title><![CDATA[php JPGRAPH总结]]></title>
<link>http://www.neilyi.cn/archives/php-JPGRAPHZongJie.html</link>
<comments>http://www.neilyi.cn/archives/php-JPGRAPHZongJie.html#comments</comments>
<category><![CDATA[PHP]]></category>
<guid>http://www.neilyi.cn/archives/php-JPGRAPHZongJie.html</guid>
<author>Neilyi</author>
<dc:creator>Neilyi</dc:creator>
<pubDate>Fri, 30 Jul 2010 02:13:17 -0700</pubDate>
<description><![CDATA[1. 设置画布

$graph->SetMarginColor('#fff');//整个图片背景
$graph->SetFrame(false); //是否显示图片边框

$graph->SetCol...]]></description>
<content:encoded><![CDATA[<p>1. 设置画布<br />  <br />   $graph->SetMarginColor('#fff');//整个图片背景<br />		$graph->SetFrame(false); //是否显示图片边框</p><p>$graph->SetColor("#fff"); //设置曲线背景</p><p>2. 定制X轴数据</p><p>$xdata = array('一月', '2月', '三月'); <br />  $graph->xaxis->SetTickLabels($xdata);   <br />  $graph-> xaxis-> SetFont(FF_FONT1 , FS_BOLD);</p>]]></content:encoded>
<wfw:commentRss>http://www.neilyi.cn/archives/php-JPGRAPHZongJie.html/feed/</wfw:commentRss>
</item>
</channel>
</rss>