解惑

解己之惑,解人之惑

分类:Linux (第1页共2页)

BASH的一些知识总结

不知不觉一个月就过去了,发现什么都没有写,趁放假补一下功课吧。

最近的几个月搞了不少BASH的东西,因为我把系统的升级功能重写了下,原来的代码实在是惨不忍睹。总结几个在重写的过程中的BASH知识点。

  1. 根据变量名得到变量值,这个在使用动态功能的时候特别有用,其实也很简单 ${!variablename}
  2. 使用管道后得到管道的某个输出的exit code:${PIPESTATUS[0]}, 0就是拿管道最开始的那个命令的返回值,如果不使用这个,那么exit code永远是0
  3. 使用“可以得到命令执行的输出结果,比如`hostname -s`,另外一种方式是$(hostname -s)
  4. 可以直接使用某个方法的返回值做if的条件判断,比如 if my_function; then
  5. 在引用变量值的时候尽可能给变量加上引号,特别是想把变量值往其他的方法传的时候,例如 my_function “$my_variable”,因为使用的那个变量值包含空格之类的就可能不是你期望的结果了。
  6. 得到当前代码行的行号:$LINENO
  7. 方法只能返回int值,不能返回string,所以方法想返回string的时候只能借助global的变量
  8. exit code的返回值范围是0到255
  9. 放在双引号里的变量会被解析,如果不想被解析,就用单引号
  10. 只有方法里面的变量才能定义为local,最外层的变量只能是global,方法里面定义的变量默认也是global
  11. 在条件判断里面做字符串大小比较,<前面要加个\:if [ “$onestring” \< “$anotherstring” ] ; then
  12. 把一个local变量的值赋值给一个global变量的时候必须在local变量前加$:globalvar=$localvar
  13. 在复杂功能里面尽量不要用xargs,因为它会起子shell,变量赋值不能传到外面的功能,尽可能用while do
  14. 做数字运算其实都是个没那么简单的事情:let “filecount-=1″,变量减一操作,其它类似,使用let加上运算表达式
  15. 判断是否是空值:if [ -z $somevar] ; then
  16. 需要把多行的语句放到一行的,应该换行的地方加个分号
  17. 方法后面的参数可以接其它的方法,后面的方法甚至还可以带参数,只要在方法里面调用”$@”就可以
  18. 获得上一个语句的返回值:$?
  19. 循环处理数组中的每个值:for value in “${my_array[@]}”
  20. 判断一个变量值是否设置了:if [ -z ${myvar+x} ]; then echo “not set”; fi
  21. 如果要计算两个数并赋值给其他的变量:thirdvar=$(expr $firstvar + $secondvar)
  22. 条件判断中的字符判断直接用=,数字比较就得 -eq, -gt等,文件目录判断 -f,-d
  23. 计算数组的大小:${#myarray[@]}
  24. 把数组里面的值拼成字符串,可以使用”${nodes[@]}”,但是如果你要把这个作为方法的参数传递则不行,必须先把这个结果赋值给一个变量再传递那个变量值:allvalues=”${myarray[@]}”; my_function “$allvalues”

好像还不少,任何一个语言,要用好都不容易,但是如果你知道自己要什么,其实也不难,有google啊。

Puppet运行脚本失败

puppet运行一个shell的脚本,如果是puppet的agent定期执行的,就是不成功,但是puppet agent -t运行就可以,开始以为是用户身份的问题,加了调试命令打出来的用户身份没有问题,脚本里面原来也有reboot也是不好使,但是加了sudo在前面就解决,就在那个命令前面也加了sudo,还是不好使,改成su再执行,依然不行,百思不得其解。

后来灵光一现,打印了命令行执行时的env,然后在脚本里面也把env输出了出来,通过puppet的service跑的时候果然env里面少了很多东西,仔细想想也了然,因为puppet的service的启动顺序是早于系统的那个profile的初始化的,所以很多环境变量没有被设置。

把在控制台直接跑的时候的env的结果保存下来并在脚本里面import进去再运行,果然没有问题。

这个很妖异的问题就这么解决了,命令行直接执行脚本以及puppet agent -t直接运行都没有问题,但是puppet的service自动触发的就是不行,源于service的启动早于系统的完全初始化。

mod_rewrite规则是有顺序的

原来曾经写过一个有关JR的PR的值的问题,今天littlebat留言说明了原因,使用301永久重定向就可以解决,当然马上试了下,但是遇到一个问题,例如我访问http://jiehoo.com/google%e4%b9%9f%e4%b8%8d%e6%98%af%e4%b8%87%e8%83%bd%e7%9a%84.htm,我期望他转向到http://www.jiehoo.com/google%e4%b9%9f%e4%b8%8d%e6%98%af%e4%b8%87%e8%83%bd%e7%9a%84.htm,但是它总是转向到http://www.jiehoo.com/index.php,很奇怪,后来突然想到这个规则定义可能是有顺序的(没有系统的学习mod_rewrite),试了下,果然如此:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^jiehoo.com [NC]
RewriteRule ^(.*)$ http://www.jiehoo.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

我刚开始是把上面的那个规则写到后面的,因为那个规则是wordpress需要的。

服务器的硬件问题

去年一年JR的服务器一直处于时常崩溃的境地,后面我写了一个shell脚本监测服务进程的状态并可以自动重启从一定程度解决了这个问题,但是没有从根本上解决,我一直怀疑是服务器的硬件问题,因为我们的那个服务器投入使用的调试期竟然有三个月之久,最开始服务商并不承认是他们的服务器的硬件问题,怀疑我们的软件有问题,但是我们在另外一个机器上正在跑的JR是完全正常的,后来我好不容易在第N次重装系统的时候发现他们的硬盘有问题,换了硬盘后问题缓解,但是还不是非常稳定,最终他们的人换了内存才更好了一点。今年春节前服务器彻底崩溃,更换了服务器,他们并没有给服务器配置那个监控服务,但是服务器稳定的工作到我回来,至今也没有发生过宕机的问题,由此证明了去年一年我在服务器维护上的时间投入全是拜奸商所赐。

igenus最新版的问题

今天帮朋友装igenus,使用的最新版igenus_2.0.2_20040901_release.tgz
但是很多页面都有类似Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result
resource in这样的信息,到官方网站看了下也没有找到什么好的资料,后来朋友查了下,要在那些mysql函数前加@就可以了,搜索全部的php文件,在以下四个函数前加@把问题搞定“
mysql_num_rows
mysql_query
mysql_fetch_object
mysql_field_seek

发现这个版本的代码有点混乱,这些函数,有的自己加了@,有的没有加。

Red Hat9下解决无法画图的问题

已经有几个人问我这个问题了。
整理下写下来了。
对于以控制台方式启动的Red
Hat9服务器而言,需要启动一个虚拟的图形环境,安装的软件包就是XFree86-Xvfb-4.3.0-2.i386.rpm,在配置前先用rpm
-q XFree86-Xvfb查一下有没有安装,没有的话就要安装了,有可能这个包依赖的很多包都没有装,一下是个大致的列表,可能都要安装:
desktop-file-utils-0.3-5.i386.rpm    
XFree86-base-fonts-4.3.0-2.i386.rpm
Glide3-20010520-25.i386.rpm          
XFree86-xauth-4.3.0-2.i386.rpm
switchdesk-3.9.8-15.i386.rpm         
XFree86-Xvfb-4.3.0-2.i386.rpm
XFree86-4.3.0-2.i386.rpm             
xinitrc-3.32-1.noarch.rpm
XFree86-75dpi-fonts-4.3.0-2.i386.rpm

可以以rpm -ivh *.rpm把这几个一起装

完成后修改下/etc/rc文件,在最后加下面一行:
Xvfb :1 -screen 0 1280x1024x8 &

然后修改tomcat的启动脚本,要给JAVA加-Djava.awt.headless=true

在apache2下配置mod_limitipconn的问题

昨天按照一些文安装配置了mod_limitipconn,但是其实大部分的文章在说明的时候并没有说清楚,其中最大的一个问题就是安装以后安装程序修改httpd.conf文件是有问题的,默认情况下是添加了:
LoadModule limitipconn_module modules/mod_limitipconn.so
AddModule mod_limitipconn.c

其实后面的那个AddModule mod_limitipconn.c是要删除的,否则apache2不能正常启动,AddModule似乎是apache1.3的语法。

apache2下的可以限速和IP数的模块

可以限速的找到两个,一个是Bandwidth Module,Version 0.5rc1, Bandwidth and Connection control per Virtual Host or Directory, Last Updated January 28th, 2005,http://www.ivn.cl/apache/
另外一个mod_cband,Version 0.9,A virtual host
bandwidth-limiting module provided to solve the problem of limiting
virtualhosts bandwidth usage,Last Updated September 07th, 2005,http://cband.linux.pl/

可以限制连接数的也有两个:

mod_vhost_limit,
v0.1,
Restrict the number of simultaneous connections per vhost,

Last Modified : 2004.02.26,http://www.ivn.cl/apache/

mod_limitipconn,Version 0.22,Limit the number of simultaneous connections from a single client IP
address. Contains rudimentary support for detection of proxy clients,Last Updated July 22nd, 2003,http://dominia.org/djao/limitipconn2.html

服务器破天荒的连续工作了12个小时以上

从昨天下午服务器宕机后打电话让机房重启开始(大约五点半)到今天早上9点半,差不多16个小时服务器连续工作,更可贵的是tomcat也一次都没有死,真是一个奇迹。
不过实际上还是做了一些工作,但是我到现在都不知道是哪个工作让服务器稳定的工作的,回想一下做的内容:

  • 修改服务器的状态监控脚本,不再使用ps -e|grep jsvc而是使用ps -fC jsvc,另外就是将两个tomcat的启动隔离开,哪个死掉了只重启死掉的那个。但是由于服务器一直没有死掉过,因此这个可能不是主要因素。
  • 屏蔽了一个IP,好像是瀛海威的用户的,这个可能是一个重要因素
  • 和服务商说我们的服务器开始的时候几个月没有能使用就是频繁死机,最后查明是内存的问题,如果还这样就要求更换内存(难道真的是服务商做的手脚?)
  • 换用了JDK5,但是已经是今天前的事情了。

又看了一遍,比较合理的嫌疑是遭到攻击,因为根据日志分析的结果那个IP近几天都对我们网站的大量内容有访问,而昨天偶然之间发现日志分析在统
计访问量时实际上是统计访问的不同内容的,同一地址的访问只算一个,因此一万多的访问就是意味着访问了网站的一万多个不同的内容,这个应该不是正常人可以
办到的,只能是程序遍历或者是大量用户使用同一个IP出口。先封掉再说,再查查看那个IP。

Linux内核模块编程指南

这个是我大学的时候利用寒假的时间翻译的,记得当时还特意让我妈买了一个电取暖器,窝在家里很长时间才弄完的,可惜时间太长,原件我这里都没有了,现在也没有找到可以下载全部内容的地方了。贴个链接在这里做个纪念吧,毕竟是我最开始为开源做出的一点贡献。

Linux内核模块编程指南

更早的文章

© 2020 解惑

本主题由Anders Noren提供向上 ↑