根分区只读后会产生很多奇怪的问题

 

 1. 卸载一个分区后,df 仍显示该分区,因为根分区只读,卸载操作成功了,但修改根分区下配置文件的操作没有成功,通过strace发现,df是读文件的,好像读的是/etc/mtab

2. /root 的历史命令没有记录,因为根分区只读,而root刚好在根分区,所以history文件无法修改就没有记录

3.  。。。

令人琢磨的 history 命令

大家知道 history命令可以列出最近执行过的命令,而且我们也知道,最近执行过的命令是存放在用户目录下的.bash_history 文件中的;但是有一点令人迷惑,我同时以同一个用户身份打开两个终端,交替在两个终端中执行命令,这时,我们分别在每个终端中使用history命令,显示的都是当前终端里刚执行过的命令,而不是两个终端执行的命令的交叉显示,我们说,执行过的命令是存入文件的,而打开文件,发现里面没有我们刚执行过的命令,这时我们不得不怀疑,刚才执行过的命令并没有立即写history文件,肯定是先缓存起来了,那么什么时候才写文件呢?目前我只知道当exit的时候是要写文件的,其它的时候,如果执行的命令足够多了,会写文件吗?这个还不清楚。

我起初是考虑使用strace 看看history是怎么执行的,但是计算机死活说history不是命令,type history 看看,原来history是内置命令,不是文件,所以strace就不管了,由此也知道了,strace 不能跟踪内置命令,因为strace可以跟踪一个进程(使用进程的pid),如果内置命令也是要产生进程的话,肯定是可以跟踪的,猜想内置命令执行时并不产生一个进程

注意:默认history命令列出很多曾经执行的命令,如果只要后n条,可以history n

 

strace 也能用,直接strace bash进程就行了

关于cookie

关于cookie曾经研究过一些,现在补充一些:

1. 进程cookie的实现
从http协议的角度来讲,进程cookie和文件cookie都是用Set-Cookie 来发送的,其区别就是进程cookie没有设置过期时间,而文件cookie有过期时间,PHPSESSIONID是典型的没有过期时间的cookie,不过,除此之外,我们自己设置cookie时只要不指定过期时间,都是进程cookie的,只保留在内存中,不写入cookie文件,达到重启浏览器session失效的效果。不过,还有一点需要注意,也是我从来没有注意到的,PHPSESSIONID也不是说绝对就是进程cookie的,在php.ini 中有下述设置:

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 10

该设置是指定设置PHPSESSIONID这个cookie时(不影响其它进程cookie的设置是否指定过期时间,0 为不指定,这是正常情况,这样PHPSESSIONID就被设置为进程cookie,如果非0 ,那么发送PHPSESSIONID的Set-Cookie 头时就是含有过期时间的,对于浏览器而言,不管该cookie叫什么名字或起什么作用,只要有过期时间,就是文件cookie(即:写入文件),因为session是要重启浏览器就失效的,所以,我建议将此值设置为0;另外,如果设置的时间比较短而且客户端与服务器的时间差又比较大,可能就无法登陆,因为session刚设置就失效,服务器上的一个将来的时间可能对客户端来说已经是过去的时间了。

2. php发展到4.0 以后,register_globals 一般都设置为off ,所以,我不建议使用session_register();函数,直接使用$_SESSION这个全局变量更好,也方便。

3. 关于PHP加速器eaccelarator默认的编译禁用session的说明:

PHP 资源类型 — stream

PHP 中有一中特殊的变量叫资源,其中一种资源类型叫 stream,这里就说说stream

1. 获取可以使用的流:
print_r(stream_get_wrappers());

2. 注册一个用 PHP 类实现的 URL 封装协议,允许用户实现自定义的协议处理器和流,详细请参看手册,
boolean stream_register_wrapper ( string protocol,  string classname )

3. stream_context_* 类的函数 (还没来及看呢)

关于虚拟主机的配置

Apache的虚拟主机主要分两种:基于ip的虚拟主机和基于域名的虚拟主机

对于单纯的基于ip的虚拟主机来说,配置像这样:

NameVirtualHost 10.10.10.11:80
NameVirtualHost 10.10.10.12:80

#VirtualHost 1
<VirtualHost 10.10.10.11:80>
DocumentRoot "/aaa/"
ServerName domain1
</VirtualHost>

#VirtualHost 2
<VirtualHost 10.10.10.12:80>
DocumentRoot "/bbb/"
ServerName domain2
</VirtualHost>

说明:因为每个ip都配置了虚拟主机,所以只需根据ip就可以判断要访问的是哪个虚拟主机,如果用domain2来访问,而hosts里设置domain2指向10.10.10.11,那么会访问到哪个虚拟主机呢?当然,先根据ip判断,访问 VirtualHost 1了,所以ServerName没有多大用途,师傅说可以作为环境变量(就是说环境变量里会出现ServerName的);或许您会问了,如果用127.0.0.1来访问呢,确实没有给该ip指定使用哪个虚拟主机,这种情况下排在第一个的那个(就是VirtualHost 1)就是默认虚拟主机了,就是说,没有能匹配的上的(用ip和域名匹配,ip优先),就使用默认虚拟主机

 

对于单纯的基于域名的虚拟主机,配置像这样:

#任何ip都是用虚拟主机
NameVirtualHost *:80

#VirtualHost 1
<VirtualHost *:80>
DocumentRoot "/aaa/"
ServerName domain1
</VirtualHost>

#VirtualHost 2
<VirtualHost *:80>
DocumentRoot "/bbb/"
ServerName domain2
</VirtualHost>

说明:这样的话,不管走哪个ip(因为根据ip没法区分),用domain1访问,就访问到VirtualHost 1,用domain2访问,就访问到VirtualHost 2;

对于既有基于ip的虚拟主机也有基于域名的虚拟主机,配置像这样:

#任何ip都是用虚拟主机
NameVirtualHost *:80

#VirtualHost 1
<VirtualHost 10.10.10.11:80>
DocumentRoot "/aaa/"
ServerName domain1
</VirtualHost>

#VirtualHost 2
<VirtualHost 10.10.10.12:80>
DocumentRoot "/bbb/"
ServerName domain2
</VirtualHost>

#VirtualHost 3
<VirtualHost domain3:80>
DocumentRoot "/ccc/"
ServerName domain3
</VirtualHost>

说明:
1. 要注意启动apache时,domain3指向的是哪个ip,因为<VirtualHost domain3:80>里的domain3是要解释成ip的,分析的时候就把这里当作解析成的ip来对待

2. 假设domain3解释为10.10.10.11,如果客户端用domain3指向10.10.10.11来访问,我们发现就有两个10.10.10.11:80的虚拟主机,然后根据ServerName判断,发现#VirtualHost 3是最匹配的一个虚拟主机,于是#VirtualHost 3就是要访问到的虚拟主机;

3. 假设domain3解释为10.10.10.11,如果客户端用domain3指向10.10.10.12来访问,先根据ip判断,只有#VirtualHost 2是匹配的,所以#VirtualHost 2就是要访问到的虚拟主机;

4. 要想只要用domain3访问,都是访问/ccc/目录,那么就要对两个ip都配置ServerName为domain3的虚拟主机;我们想,将#VirtualHost 3改成如下行吗:
#VirtualHost 3
<VirtualHost *:80>
DocumentRoot "/ccc/"
ServerName domain3
</VirtualHost>

答案是:不行;因为做ip匹配的时候,优先选用更精确匹配的一个,显然与另外两个虚拟主机相比,通过任何一个ip访问,* 都不如直接用ip定义的虚拟主机精确,所以这时的#VirtualHost 3只有通过环回地址访问,而且只要通过环回地址访问,使用任何主机名访问的都是#VirtualHost 3;

对于NameVirtualHost的使用
如果某个ip:port 上只设置了一个虚拟主机,那么NameVirtualHost ip:port 可以不写,因为从这个ip:port的访问不需要做任何选择;
如果某个ip:port 上设置了多于一个虚拟主机,那么必须使用指令
NameVirtualHost ip:port ,
否则从该ip:port的访问只访问第一个该ip:port 的虚拟主机(因为它优先,apache启动时会提示的);
如果使用了指令
NameVirtualHost ip:port ,
却没有为该ip:port定义任何虚拟主机,好像不会出现访问到错误的虚拟主机的问题(因为谁也不知道你想干什么,不过apache还是会提示你:[warn] NameVirtualHost ip:port has no VirtualHosts);
如果VirtualHost 指定的虚拟主机没有匹配一个NameVirtualHost 指令,那么该虚拟主机不会被用到(除非他是第一个虚拟主机),这相当于没有NameVirtualHost 指令,即:如果有多个虚拟主机,一定要有NameVirtualHost 指令

注:

虚拟主机中可以缺省很多指令,我曾经只是想给通过不同域名的访问分别记录日志,实际上他们访问的都是相同的东西,所以DocumentRoot指令就可以省略了,里面我只写了三条指令,如:

<VirtualHost *:80 >
        ServerName *
        TransferLog "|rotatelogs /backup/apachelog/%Y%m/access_log.%Y%m%d 86400 480"
        ErrorLog "|/rotatelogs /backup/apachelog/%Y%m/error_log.%Y%m%d 86400 480"
</VirtualHost>


打包大批量文件的方法

对于大批量的文件如果要tar的话,是不能直接:tar -cvf a.tar * 的,因为* 扩展开来太大了,会出现参数太长的错误,一般来讲这种问题都通过xargs命令来解决,如:

ls * | xargs tar -rvf a.tar

注意:
1. 这里用到了tar命令的选项 -r ,是append的意思,但是如果tar文件不存在,也有create的作用
2. -r 选项不能和 -z 选项同时使用,所以需要压缩的话,都tar完之后再gzip

如果不知道 -r 选项,当然还可以 把所有要tar的文件mv到一个新的目录,还得用到xargs命令,不过这时就有点问题了,如:

ls * | xargs mv source target

因为一般情况下我们使用mv时,目标是最后一个参数,所以用xargs传参就有些不合适,但是我man mv 发现可以用选项指定目的地,可以这样写:

ls * | xargs mv –target-directory=/newdir/
然后:tar -zcvf a.tar /newdir

注: 这里的ls * 仅代表数据源的意思,不要直译,可能是find ….或 grep .. 等

一句话自省

一个好东西可能不是它本身有多好,可能多半是它放对了地方;就好像说话,同样一句话,聪明人会说的恰到好处,糊涂人会说的让人啼笑皆非。

人们总是在追求完美的,尽管永远也做不到。

喝酒伤胃,不喝酒伤心。 —2008-09-21 14:43

不要轻易把某个女人比作天使,那样她可能把你比作狗屎。

什么都可以改变,只要你用心;什么都扯淡,只要你不在乎。  —曾用过的msn签名

做事要有原则,更要有方法。   —曾用过的msn签名

百度百科 谚语 : http://baike.baidu.com/view/23790.html

纪念5.12 汶川大地震

    2008.5.12 14:30 左右, 我在北京市中关村理想国际大厦18层,感觉是工作有点累了,自己连同办公桌前后晃动,大概有几秒钟,我发现有些不对,地震?往左右看看,同事都站起来了,地震!地震!果然是地震,我一下子慌了,这是我平生第一次经历地震,因为我们楼高,通过窗户往外望,只觉得楼在晃动,虽然幅度很小,但是还是可以看到的,‘晃动’本身并不可怕,可怕的是这么大个庞然大物在晃动,还是我第一次看到,我有点惊呆了,虽然都知道是地震,但是也仅仅是很小的骚动,没有慌慌张张逃命的现象。不过我倒是很想赶快离开这座大楼,只是我有突然觉得坐电梯很不安全,所以就和大伙儿一块原地呆着,很快,地震过去了,行政部要我们赶快疏散,下了楼才知道,地震不是针对我们来的,震中在四川汶川县,全国大部分地区有震感。

    今天早上起来,手机传来短信,四川死亡近万人,作为一个中国公民,我知道,这是我们国家的异常劫难,2008 太不同寻常了,逢春节,北方无事,南方却遭受百年不遇的雪灾;现在,一个汶川地震,全国都在晃动。

    我想,我们在党中央的领导下,全国人民齐心协力,严重的雪灾没有给我们国家造成太大的创伤;现在,汶川大地震,温家宝总理又亲临第一线,我们每一个中国公民都要在党中央的领导下,为汶川人民重建家园,做出一点自己的行动!

ulimit 详解

ulimit [-SHacdflmnpstuv [limit]]
Provides control over the resources available to the shell and to processes started by it, on systems that
allow such control. The -H and -S options specify that the hard or soft limit is set for the given
resource. A hard limit cannot be increased once it is set; a soft limit may be increased up to the value of
the hard limit. If neither -H nor -S is specified, both the soft and hard limits are set. The value of
limit can be a number in the unit specified for the resource or one of the special values hard, soft, or
unlimited, which stand for the current hard limit, the current soft limit, and no limit, respectively. If
limit is omitted, the current value of the soft limit of the resource is printed, unless the -H option is
given. When more than one resource is specified, the limit name and unit are printed before the value.
Other options are interpreted as follows:
-a All current limits are reported
-c The maximum size of core files created
-d The maximum size of a process’s data segment
-f The maximum size of files created by the shell
-l The maximum size that may be locked into memory
-m The maximum resident set size
-n The maximum number of open file descriptors (most systems do not allow this value to be set)
-p The pipe size in 512-byte blocks (this may not be set)
-s The maximum stack size
-t The maximum amount of cpu time in seconds
-u The maximum number of processes available to a single user
-v The maximum amount of virtual memory available to the shell

If limit is given, it is the new value of the specified resource (the -a option is display only). If no
option is given, then -f is assumed. Values are in 1024-byte increments, except for -t, which is in sec-
onds, -p, which is in units of 512-byte blocks, and -n and -u, which are unscaled values. The return status
is 0 unless an invalid option or argument is supplied, or an error occurs while setting a new limit.

 

中文解释:

-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

 

配置文件: /etc/security/limits.conf 可以针对用户或组进行永久性 配置,使用命令的配置是临时的,针对当前用户的,不写文件的,退出当前shell就没有了的,写在配置文件中可以永久生效