第十日 接着写代码 , 端口/进程的占用情况 lsof
=== 琐事 ===
我是一个玩物丧志的人, 堕落地看了几天美剧<太空堡垒卡拉狄加>, 终于在周六结束了这荒淫无度的生活.
子在川上曰:逝者如斯夫,不舍昼夜
昨天完成了添加网站的功能, 现在已经有35个网站了 (见
http://kanrss.com/www/who )
如果你觉得不错网站 , 欢迎在这里提交
http://kanrss.com/www/join
=== 技术 ===
恩, 为了减少写网站的主机带宽成本, 我也兼职卖卖空间 (
http://stdyun.com/vhost ) .
不过那些域名的备案很浪费我宝贵的青春, 用经济学术语说就是"边际成本太高", 所以我一直很低调的卖着.
我提供了一种用nginx的做端口转发的模式, 然后就有用户跑来跟我说 -- 我的端口被别人占用了.
恩, 当然 ,用 netstat 可以看到端口的占用情况 -- 不过我更喜欢 lsof , 通常它会更快一些.
lsof 不是系统自带命令,需要安装. Gentoo用户只需要简单的 emerge lsof .
然后以root用户运行它 -- 不然当你检查其他用户进程占用端口情况的时候 , 会有很多权限的问题
以80端口为例
lsof -i :80
结果如下
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 19319 root 10u IPv4 9341 0t0 TCP *:http (LISTEN)
nginx 19320 nginx 10u IPv4 9341 0t0 TCP *:http (LISTEN)
nginx 19321 nginx 10u IPv4 9341 0t0 TCP *:http (LISTEN)
很清晰, 我不多说了. 更多使用的方法可以看看这篇文章 , "使用 lsof 查找打开的文件"
http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html 。
lsof 就是用来看 哪个进程打开了哪个文件 的工具.
"刚刚我们岂不是查看端口?" -- 千分之一的小白会这样问.
那么请牢记 UNIX格言 : 一切都是文件. -- 当然 Linux 也差不多, 就不纠结是 UNIX 还是 Linux了.
"""
这里的“一切”确确实实意味着一切。硬盘,硬盘分区,并行口,到网站的连接,以太网卡:所有这些都是文件。甚至目录也是文件。除了标准的文件和目录,Linux 还可以辨识很多别的类型的文件。
注意这里说的文件类型不是文件内容的类型:对于Linux系统,不论是 PNG 图象,二进制文件还是其他什么,文件就是一串数据流。通过内容区分文件类型是留给应用程序的任务。
"""
所以, 我更喜欢跟玄之又玄的一种说法 -- 万物皆流 (古代哲学家 赫拉克利特
http://baike.baidu.com/view/23031.htm ).
OK, 说到Unix格言, 我顺便汇总一下. 不喜欢Unix的人请 goto 《UNIX痛恨者手册》 ; // 文章结尾
* Everything (including hardware) is a file
所有的事物(甚至硬件本身)都是一个的文件。
* Configuration data stored in text
以文本形式储存配置数据。
* Small, single-purpose program
程序尽量朝向小而单一的目标设计
* Avoid captive user interfaces
尽量避免令人困惑的用户接口
* Ability to chain program together to perform complex tasks
将几个程序连结起来,处理大而复杂的工作。
Unix管道的发明人、Unix传统的奠基人之一Doug McIlroy在[McIlroy78]中曾经说过:
1. 让每个程序就做好一件事。如果有新任务,就重新开始,不要往原程序中加入新功能而搞得复杂。
2. 假定每个程序的输出都会成为另一个程序的输入,哪怕那个程序还是未知的。输出中不要有无关的信息干扰。避免使用严格的分栏格式和二进制格式输入。不要坚持使用交互式输入。
3. 尽可能早地将设计和编译的软件投入试用, 哪怕是操作系统也不例外,理想情况下, 应该是在几星期内。对拙劣的代码别犹豫,扔掉重写。
4. 优先使用工具而不是拙劣的帮助来减轻编程任务的负担。工欲善其事,必先利其器。
后来他这样总结道(引自《Unix的四分之一世纪》(A Quarter Century of Unix [Salus])):
Unix哲学是这样的:一个程序只做一件事,并做好。程序要能协作。程序要能处理文本流,因为这是最通用的接口。
Rob Pike, 最伟大的C语言大师之一, 在《Notes on C Programming》中从另一个稍微不同的角度表述了Unix的哲学[Pike]:
原则1:你无法断定程序会在什么地方耗费运行时间。瓶颈经常出现在想不到的地方,所以别急于胡乱找个地方改代码,除非你已经证实那儿就是瓶颈所在。
原则2:估量。在你没对代码进行估量,特别是没找到最耗时的那部分之前,别去优化速度。
原则3:花哨的算法在n很小时通常很慢,而n通常很小。花哨算法的常数复杂度很大。除非你确定n总是很大,否则不要用花哨算法(即使n很大,也优先考虑原则2)。
原则4:花哨的算法比简单算法更容易出bug、更难实现。尽量使用简单的算法配合简单的数据结构。
原则5:数据压倒一切。如果已经选择了正确的数据结构并且把一切都组织得井井有条,正确的算法也就不言自明。编程的核心是数据结构,而不是算法[7]。
原则6:没有原则6。
Ken Thompson——Unix最初版本的设计者和实现者,禅宗偈语般地对Pike的原则4作了强调:
拿不准就穷举。
《The Art of Unix Programming》
1. 模块原则:使用简洁的接口拼合简单的部件。
2. 清晰原则:清晰胜于机巧。
3. 组合原则:设计时考虑拼接组合。
4. 分离原则:策略同机制分离,接口同引擎分离。
5. 简洁原则:设计要简洁,复杂度能低则低。
6. 吝啬原则:除非确无它法,不要编写庞大的程序。
7. 透明性原则:设计要可见,以便审查和调试。
8. 健壮原则:健壮源于透明与简洁。
9. 表示原则:把知识叠入数据以求逻辑质朴而健壮。
10. 通俗原则:接口设计避免标新立异。
11. 缄默原则:如果一个程序没什么好说的,就沉默。
12. 补救原则:出现异常时,马上退出并给出足够错误信息。
13. 经济原则:宁花机器一分,不花程序员一秒。
14. 生成原则:避免手工hack,尽量编写程序去生成程序。
15. 优化原则:雕琢前先要有原型,跑之前先学会走。
16. 多样原则:决不相信所谓“不二法门”的断言。
17. 扩展原则:设计着眼未来,未来总比预想来得快。
1994年,X窗口系统开发组的成员Mike Gancarz根据他自己的Unix系统经验以及和其他领域使用Unix系统的资深程序员们的讨论结果,写成了《The UNIX Philosophy》,提出了9条训格之言:
一:小即是美。
二:让程序只做好一件事。
三:尽可能早地建立原型。
四:可移植性比效率更重要。
五:数据应该保存为文本文件。
六:尽可能地榨取软件的全部价值。
七:使用shell脚本来提高效率和可移植性。
八:避免使用可定制性低下的用户界面。
九:所有程序都是数据的过滤器。
《UNIX痛恨者手册》:
最后推荐一下 《UNIX痛恨者手册》
http://kanrss.com/down/doc/unix_haters.html 。
这是一本很有趣的书, 是那些用惯UNIX的人对UNIX的各种指责,诋毁,谩骂和嘲笑. 是由爱而生的恨. 摘录一段:
UNIX态度
我们展现了一个非常惨淡的图景: 迷一般的命令名,不一致和无法预计的运行结果,危险命令没有保护,无法接受的在线文档以及在错误检查和容错性方面的稀松工作。那些参观UNIX的人不是为了得到热情款待,他们不是迪斯尼公园中的游客,更像是执行任务中的联合国维和部队。
UNIX怎么会搞成这个样子?如我们曾指出的那样,其中有一些是历史原因造成的。但是还有其他的原因:那就是多年来形成的UNIX文化,这种文化被称为 “UNIX哲学”。
UNIX哲学不是来自Bell实验室或UNIX系统实验室的手册。他是自然形成的,其中包含了许多人的贡献。Don Libes和Sandy Ressler在《UNIX生活》(Life with UNIX)中对UNIX哲学作了很好的总结:
小即是美
用10%的工作解决90%的任务
如果必须作出选择,选择最简单的那个。
根据UNIX程序和工具的实际表现来看,对UNIX哲学更为精确的总结应该是:
小的程序比正确的程序更好
粗制滥造是可以接受的
如果必须作出选择,选择责任最小的那个。
UNIX没有哲学,UNIX只有态度。
这个态度指出简单的做了一半的工作比复杂完整的工作更好。这个态度指出程序员的时间比用户的时间更为珍贵,即使用户比程序员要多得多。这个态度指出达到最低要求就足够了。
............. ............. ............. .............
我被这里散步的文档无用论观点深深折服了。事实上,我进一步认为文档就是毒*品,我对于它的依赖性是人为造成的。在专业人士的帮助下,我想我能够戒掉 它。
而且,我的良心告诉我不能再靠贩卖这种毒*品为生了。我决定回到数学研究院脱胎换骨,彻底从这个寄生虫一样的职业中脱身。
虽然下面这份文档似乎表明了我中毒有多么深,可我还是觉得下一版SGI中应该把它提供给用户。这不过是暂时之举,以后会把它搞掉的。
这是我的建议:
标题:“无言UNIX”
对象:UNIX新手
简介:提供在没有文档条件下使用UNIX的通用策略。展示在没有文档条件下摸清任何操作系统的通用原则。
内容:
介绍:“无文档”哲学简介
为什么手册是恶魔
为什么man手册是恶魔
为什么你还是应该读这份文档
“这将是你读的最后一份文档!”
第一章:如何猜测可能存在哪些命令
第二章:如何猜测命令名
UNIX的怪异缩略命名法
案例:grep
第三章:如何猜测命令选项
如何破解怪异的使用说明
案例:tar
如何知道什么时候顺序是重要的
案例:fine
第四章:如何知道运行正确:没有消息就是好消息
从错误中恢复
第五章:口头传统:你的朋友
第六章:如何获得和维持一个活生生的UNIX高手
如何喂饱你的高手
如何让高手高兴
提供全部新闻组连接的重要性
为什么你的高手需要最快的计算机
免费可乐:高手的长生不老药
如何保持高手身体健康
高手什么时候睡觉?
第七章:常见疑难:你的高手不理你了
识别愚蠢的问题
如何安全地提出愚蠢问题
第八章:如何承受压力
如何对待失败
注:可能只有6、7章才是真正需要的。是的,这才是正路:我把它称为“UNIX高手驯养指南”。