grep过滤进程时去掉自身的一个小技巧
很多时候,我们需要查看某个进程是否存在,一般可以通过
ps -ef | grep <程序名>
来查看。但是,它有一个小缺陷:结果里会多出一个 grep xxx
条目。这个条目正是 grep
进程本身的。
这里有一个小技巧可以消除 grep
进程自身的条目。如下:
ps -ef | grep
[j]
ava
具体含义:
1) |
是管道符号,代表 管道前进程的输出 连接到 后面进程的输入。
2) ps -ef
会输出一个列表,包含当前系统中的所有进程
可以想象一下,实际上 前面 ps
列表中的 grep
进程条目会是类似这个样子:
root 13264 0.0 0.0 103292 492 pts/8 D+ 19:02 0:00 grep [j]ava
3) 而 grep [j]ava
表示过滤出包含 [j]ava
字串的进程。[j]ava
字串是一个正则表达式,它的含义实际上就是 java
字串,不能匹配 [j]ava
字串,所以过滤掉了!
正则表达式匹配复杂密码的一个实例
参考来源:
- http://deerchao.net/tutorials/regex/regex.htm#lookaround
- http://www.regular-expressions.info/lookaround.html
刚刚听赵杰说到正则表达式,突然想起以前看过的一个例子,感觉想法很巧妙,所以记录下来,分享一下。
在网站注册过程中,经常能看到类似这样的要求:密码必须包含一个大写字母,一个小写字母,一个数字,位数超过8位等等。
很自然的,会想到用正则表达式来做。比如说
1. 匹配 8位以上 这个要求,很容易: .{8,}
2. 匹配 至少一个大写字母,也很容易:.*[A-Z].*
3. 匹配 至少一个小写字母:.*[a-z].*
4. 匹配 至少一个数字: .*[0-9].*
但是继续分析就会发现,把上面几个部分组合的时候就会遇到一些麻烦。
比如,类似 .*[A-Z].*[a-z].*[0-9].*
这样的表达式就达不到要求。它有下列缺陷:
1.限定了 大写字母,小写字母,数字 出现的顺序。比如说, 本来 heLLO2012
这样的字符串是符合业务要求的,但是上述表达式却无法匹配它。然后我们可能想试试 分支 (Alternation),比如:
.*[A-Z].*[a-z].*[0-9].* | .*[a-z].*[A-Z].*[0-9].* | .*[0-9].*[a-z].*[A-Z].* | .....
恩..虽然说能达到 不限顺序 的要求,不过很难看,而且它还有一个致命问题(见第二条)。
2.总位数没有限制到。虽然改成 .*[A-Z].*[a-z].*[0-9].{5,}
确实可以让达成 8位以上 这一限制。但是它却限定了字符串必须是 <大写字母><小写字母><数字>xxxx
这种模式,显然不符合业务要求。而且很快会发现 .{5,} 放在哪里都不合适。
综合以上两点,使用普通的元字符和重复组合是非常难达到要求的。
为了解决类似的较复杂的情况,正则引擎引入了一个很强大的功能:向前搜索 (lookahead)。向前搜索又称为零宽断言。它和匹配单词开头和结尾的锚 (anchor) 很相似。不同之处在于,它确实会去匹配一些字符,然后丢弃匹配到的结果,只返回一个结果:匹配 还是 不匹配。这也是为什么它被叫做“断言”。它不会消费待测试字符串里的字符,仅仅只是判断匹配是否可能。
注:这里“向前”中的“前”是指字符串的右边(从左到右阅读)。
比如: ab(?=c)
表示仅匹配后面跟着 c
的 ab
字串。ab,abd
等字符串就匹配失败。
关键的地方到了。看看把向前搜索放到前面会是什么样子?比如: (?=a)bc
, 它的意思是匹配字串 bc
,然后 这个字串的第一个字母是 a
,很明显,这个表达式永远匹配失败,因为它本身就是矛盾的。看起来似乎把 向前搜索 放到前面没什么用。
其实稍微做一点改变,它就能化腐朽为神奇了: (?=.*[a-z]).*
,这个表达式的含义是: 匹配任意的字符串,但是其中必须包含一个小写字母,且位置不限!
现在回头看看问题,答案就出来了:
(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])\w{8,}
centos6.3修改硬盘分区后必须重启的问题
有时候,出于一些原因需要对硬盘进行分区调整。但是经常发现分区修改后,系统无法重读分区信息到内存中,必须重启。很多时候,这实在是很不方便,而且也没什么道理的感觉(?)。
在网上搜索这个问题的时候,找到了答案:
https://bugzilla.redhat.com/show_bug.cgi?id=614357
问题原因:centos6.3 的软件库提供的 parted 是 2.1 版本的。软件作者处于安全考虑,禁止不重启的情况下分区表生效(类似于fdisk等软件的方式)。
解决方法:很简单,更新parted到最新版(3.1)即可解决。编译过程略。
nfs网络文件系统的用户名问题
问题:
渠道那边的服务器出了个问题:192.168.0.24 通过nfs来共享一个文件夹 x。 但在192.168.0.21里挂载到该文件夹x后,看到的用户名和24上看到的不一样,甚至是uid也是不同的。
原因:
后面发现,nfs使用了一种uid映射机制nfsidmap,有可能x目录在0.24上的拥有者用户id是501,但是在0.21上看着是502。当然,一般情况下应该是一致的,不过由于手动修改过用户名对应的uid,而nfsidmap却没有相应的更新。导致前面情况的出现。
解决方法:
很简单,执行一下:
nfsidmap -c
部分内网http服务器只有一个域名(虚拟主机)能正确响应的问题
问题
最近,渠道的一台服务器出了一个问题:这台服务器的http配置了多个域名(虚拟主机),但是只有一个域名能正确响应。比如:
192.168.0.2x 的http上有两个域名,channel-X.ccms.fenxibao.com 和 channel-Y.ccms.fenxibao.com。他们都是通过 192.168.100.2 这台代理服务器接受外部网络的http请求。但是实际使用发现,从外部网络只能访问channle-X。
原因
这个是由于http代理服务器的一个特性导致的:当一个http请求经过代理的时候,它的host头信息会变成代理配置的目标ip(或域名)。如果目标机器的http服务器上只有一个虚拟主机,这样做没什么问题。但如果有多个虚拟主机的时候,目标机器就无法做出正确判断了。这时候我们需要保留原始http请求的host头,以便位于代理之后的http服务器能正确区分虚拟主机(域名)。
解决
在代理服务器上给相应的域名(虚拟主机)增加一个配置项:
ProxyPreserveHost On
问题
上次在apache代理服务器中配置了ProxyPreserveHost On后,后端的http服务器能够正确响应请求了。但是又出了一个新问题,后端服务器发出的重定向请求的端口未经修改就直接发送给了客户端,导致客户端连接重定向页面时失败。
比如:在代理服务器中配置了channel-X.ccms.fenxibao.com这个域名,指向的是内部的192.168.0.20这台服务器,配置如下:
<VirtualHost *:80>
ServerName channel-X.ccms.fenxibao.com
...
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://192.168.0.20:18000/
ProxyPassReverse / http://192.168.0.20:18000/
...
</VirtualHost>
但是当客户端访问首页时,会被重定向到 channel-X.ccms.fenxibao.com:18000/xxx 这样的URL,导致访问失败。
解决方法
加上一条配置:
ProxyPassReverse / http://channel-X.ccms.fenxibao.com:18000/
关于脚本中read流操作的一些注意事项
我们在用
while read i
do
done < filename
这种格式时 要注意
如果我们在循环执行 ssh 远程操作事 循环会被ssh打断,为了避免这种问题,我们可以在ssh中加上 -n 命令 。
libtool编译错误
在centos6.3上编译sysbench的时候,会出现类似下列libtool错误:
../libtool: line 838: X--tag=CC: command not found
../libtool: line 871: libtool: ignoring unknown tag : command not found
../libtool: line 838: X--mode=link: command not found
后面网上查找发现是在./configure的时候会在源文件目录下生成一个libtool文件。而这个libtool文件有错误(不兼容?)。
解决方法有两种:
1.在源文件目录下执行:
autoreconf -fi
然后重新make就行了
2.把系统的libtool复制到源文件目录下,覆盖掉configure生成的
重新make
总结:
具体过程还不清楚。有待进一步了解编译系统。