对于刚接触unix的人而言,利用管道将各种命令组合在一起来实现某个功能,是比较难适应的一件事情,下面,我就用一个具体的例子,详细讲下着里面的用法和思路.看看到底我们把命令都绑在一起,unix都做了什么.
就用一个oracle管理中,可能会遇到的例子吧,如果oracle挂了,我们通过所有正常方法都无法将其正常关闭,包括shutdown abort都无效,类似这种情况,有可能就os资源配置出了问题,导致oracle的某个核心process挂住而导致的,那这个时候,我们就要采取暴力措施,怎么暴力呢,就是通过unix的kill命令直接结束os级别的process来强制结束oracle,当然,如果遇到oracle的pmon没有及时清理session的资源,我们也可以采取类似的方法,在后面会对此进行说明.
首先看看这个命令 : ps -ef|grep "ora_"|grep -v grep|awk '{ print $2 }'|xargs kill -9
这个命令所要完成的任务,就是把当前系统中所有oracle的process全部杀掉,里面用到了ps , grep , awk , xargs , kill这几个命令.其中awk是个好东西,呵呵,不知道大家知不知道regular expression这个东西,中文翻译成正则表达式,我一直觉得不是十分准确,可也不知道该翻译成什么才精确,就用英文吧,呵呵,简称RE.我这里先提一下,等说完这个例子后,在稍微讲一下关于RE的东西,深入的,还是要靠大家研究,O'Reilly有本书是专门讲这个的,可以参考,好言归正传.我们来分析一下,为什么这个命令串可以达到这个目的.
kill是unix中终止process的命令,通常,我们如果知道一个process的pid,如果想终止它,就可以用 kill -9 pid来实现,那同样,既然oracle是透过各种process运行在os上的,我们是不是也可以同样来对待它呢,答案是肯定的,我们可以用kill -9 pid的方式来终止oracle进程,ok,回到我们的例子中,我们已经知道了清除oracle process的方法,现在就差oracle process 的pid 了,只要能把他们找出来,就万事大吉了.
如何去找它的pid呢,这时候,ps就登场了,ps这个命令,是用来查看当前系统运行的process的,最常用的参数是-e和-f,连在一起就是ps -ef ,我们在unix下运行,屏幕上就会显示出当前系统运行的process:
[oracle@blade /etc]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 Apr 11 ? 0:02 sched
root 1 0 0 Apr 11 ? 0:00 /etc/init -
root 2 0 0 Apr 11 ? 0:00 pageout
root 3 0 1 Apr 11 ? 81:30 fsflush
......
既然所有的process都出来了,那我们怎么找到那些我们要的,oracle的那些process呢,这是一个筛选功能,当仁不让,我们用上了grep,连在一起,就是 ps -ef | grep ora_ , 但是,我们这个筛选语句里面,也有符合我们要求的字符串,我们总不能把自己也杀了吧,要把自己过滤掉,这样,我们又接触到了grep 的一个参数 -v,这个参数的意思和grep 相反,grep是筛选出要的值,而-v,是把选出来的值丢掉,就是我们所谓的过滤啦,呵呵,ok,这样都连在一起了以后,就变成了 ps -ef | grep ora_ | grep -v grep :
[oracle@blade /etc]$ ps -ef | grep ora_ | grep -v grep
oracle 17830 1 0 Apr 11 ? 2:41 ora_lgwr_sinocn
oracle 17834 1 0 Apr 11 ? 0:21 ora_smon_sinocn
oracle 17846 1 0 Apr 11 ? 0:00 ora_arc0_sinocn
oracle 17840 1 0 Apr 11 ? 11:46 ora_qmn0_sinocn
oracle 17836 1 0 Apr 11 ? 0:00 ora_reco_sinocn
oracle 17850 1 0 Apr 11 ? 0:00 ora_arc2_sinocn
......
这样我们就把所有oracle的process找出来了,但是,这还不是我们最终要的,虽然我们现在看到了pid,但是,我们总不能手动的去针对一个个的pid做kill -9吧,我们必须把这些行中的pid提取出来,我们可以看到,目前屏幕输出的每一行,都是有规律的,pid位于第二列,这就给了我们机会,利用awk这个工具去帮我们对每一行进行数据提取,简单来讲 awk '{ print $2 }'的作用就是去读每一行记录,然后,只把第二列输出.
[oracle@blade /etc]$ ps -ef | grep ora_ | grep -v grep | awk '{print $2}'
17830
17852
17834
17846
......
基本上,我们要的资料,已经全部筛选出来了,剩下的,就是如何把这些pid交给kill去处理了,研究以下kill的格式,发现如果要使用kill处理多个pid,格式为 kill -9 pid1 pid2 pid3 ... ,只要能将我们的pid,格式成相同的格式,所有任务就完成了.这个就小case了,xargs处理下,就ok了.
至此,如果你有足够的权限,只要你下完整的命令,系统会清除所有oracle的process,然后,你可以尝试做其他的管理操作.
这样,通过一个例子,详细讲解了使用管道的思路,用法以及几个常用命令,在unix中要习惯使用管道,看起来有点罗嗦,呵呵,只是为了把思路说的详细点.其中涉及的命令,详细的文档,使用man命令,都可以很容易得到,希望大家在使用新的命令前,详细的读一读man的东西,更明确的知道what are you doing.
讲完正题,再来讲讲中间提到的一些东西,首先kill -9的应用,可以这样说oracle的pmon进程,还是比较"懒"的,观察一下,如果我们在oracle中运行alter system kill session ...命令,通过db来结束一个session,但是我们观察后台,经常会发现被砍掉的session经常还占着资源,pmon并未及时的进行资源的清理和释放,所以有时候,我们可以做的绝一点,通过oracle提供的view v$process , v$session,就可以根据sid,查到其所对应的pid,用kill -9 强制杀掉os process的话,这时候oracle的pmon就勤快多了,立即就释放资源了,呵呵,关于这个,跟不少兄弟讨论过,觉得oracle这样做,可能也有他的考量,可能是到了资源需要被重用的时候再去释放和重新分配资源.不过我们几个兄弟还是觉得用kill -9比较直观点,也查阅了相关资料,没什么负面的影响.
这是一个经常会用的kill -9,同样,做这个前,也请确认你找到的pid的正确性,不要砍错了process,就玩大了,呵呵.
另外一个提到的东西,就是所谓的RE了,这东西,初看起来,晦涩难懂,都是些奇奇怪怪的符号,有点不知所云的感觉,不过它确实是非常有用的一个东西,O'Reilly都专门出过一本关于它的书,书名就是<<regular expression>>,可见它并非泛泛之辈,呵呵.说到底,它的作用就是对文件或者命令的输出集进行一些文本的抽取或过滤,看似功能很简单,但确实能给我们带来极大的便利.
简单的说,RE就是处理字串的方法,它以行为单位, 来进行字串的处理行为,透过一些特殊符号的辅助,可以让使用者达到寻找/取代某特定字串的程序.更进一步,RE只是一个表示法,只要你使用的工具支援这种表示法,你就可以利用它来进行特殊的字串处理,比如常见的grep , awk , sed 等等,这里,我给出几个基本的RE符号及其含义,更深入的应用,已经有很多前辈们写了很多很好的资料,大家可以去参考.
^ 匹配行首,例如,要从文件A中寻找以B字母开头的行,可以这样 cat A | grep '^B'
$ 匹配行尾,同理,要从文件A中寻找以C字母结尾的行,可以这样 cat A | grep 'C$'
* 一个单字后面紧跟*,匹配0个或多个此单字,这个比较特殊,比如 A*,不是说行里面必须要有A,是说没有A或者有多个A都可以,如果要匹配说行里面必须有一个以上的A,就要用 AA*了,这是个比较特殊的地方,需要仔细琢磨一下,呵呵.
[] 匹配方括号内字符的任意一个,比如 cat A | grep '[ac]'就是说,行里面,要么有a,要么有c,都可以
/ 字符转义,就是屏蔽一些shell中的特殊含义的字符
. 匹配任意单字符
呵呵,基本符号就这样,还有扩展的RE,这里就不深入了,大家有兴趣自己研究下,呵呵,本章就到这里,呵呵
Unix For Oracle DBA
最新推荐文章于 2024-08-27 13:31:04 发布