unix常用命令手册.docx
《unix常用命令手册.docx》由会员分享,可在线阅读,更多相关《unix常用命令手册.docx(32页珍藏版)》请在冰点文库上搜索。
unix常用命令手册
3构建Unix命令
有的时候Unix的命令看上去很复杂,其实有可能是多个命令合在一起的。
1.分解一个复杂的Unix命令:
ps-ef|grep"ora_"|grep-vgrep|awk'{print$2}'|xargskill-9
乍看这条命令,给人很复杂神秘的感觉。
然而,这实际上是通过管道符(|)来合在一起的一组简单命令。
写成下面的格式更易懂一些:
ps-ef
|
grep"ora_"
|
grep-vgrep
|
awk'{print$2}'
|
xargskill-9
这条命令总的目的是杀掉所有Oracle的进程。
ps-ef列出所有的进程,而grep"ora_"只列出ps-ef中的ora_开头的进程;grep-vgrep的作用是进程中不列出命令本身,awk'{print$2}'的作用是只列出显示的进程的第2部分。
xargs将前面列出的内容传给后面的命令,kill-9命令会强制关闭列出来的进程。
为了更好的理解这条命令,我们不妨逐步执行这个命令,查看输出结果:
HBZW>ps-ef
UID PID PPID CSTIME TTY TIMECMD
root 0 0 1.213:
48:
38?
?
0:
36.18[kernelidle]
root 1 0 0.013:
48:
38?
?
0:
00.05/sbin/init-a
root 3 1 0.013:
48:
39?
?
0:
00.02/sbin/kloadsrv
root 5 1 0.013:
48:
40?
?
0:
00.00/sbin/hotswapd
root 53 1 0.013:
48:
56?
?
0:
00.00/sbin/update
root 170 1 0.013:
49:
00?
?
0:
00.16/usr/sbin/evmd
......
oracle 2445 1 0.014:
48:
35?
?
0:
00.36ora_ckpt_gaxz
oracle 2447 1 0.014:
48:
35?
?
0:
00.38ora_smon_gaxz
oracle 2449 1 0.014:
48:
36?
?
0:
00.07ora_reco_gaxz
oracle 2451 1 0.014:
48:
36?
?
0:
00.19ora_cjq0_gaxz
oracle 2453 1 0.014:
48:
36?
?
0:
02.20ora_qmn0_gaxz
oracle 2455 1 0.014:
48:
36?
?
0:
00.06ora_s000_gaxz
oracle 2457 1 0.014:
48:
36?
?
0:
00.07ora_d000_gaxz
…
HBZW>ps-ef|grep"ora_"
oracle 2439 1 0.014:
48:
35?
?
0:
00.08ora_pmon_gaxz
oracle 2441 1 0.014:
48:
35?
?
0:
00.09ora_dbw0_gaxz
oracle 2443 1 0.014:
48:
35?
?
0:
00.11ora_lgwr_gaxz
oracle 2445 1 0.014:
48:
35?
?
0:
00.40ora_ckpt_gaxz
oracle 2447 1 0.014:
48:
35?
?
0:
00.40ora_smon_gaxz
oracle 2449 1 0.014:
48:
36?
?
0:
00.07ora_reco_gaxz
oracle 2451 1 0.014:
48:
36?
?
0:
00.23ora_cjq0_gaxz
oracle 2453 1 0.014:
48:
36?
?
0:
02.46ora_qmn0_gaxz
oracle 2455 1 0.014:
48:
36?
?
0:
00.06ora_s000_gaxz
oracle 2457 1 0.014:
48:
36?
?
0:
00.07ora_d000_gaxz
oracle 2530 2310 0.015:
10:
56pts/1 0:
00.00grepora_
HBZW>ps-ef|grep"ora_"|grep-vgrep
oracle 2439 1 0.014:
48:
35?
?
0:
00.08ora_pmon_gaxz
oracle 2441 1 0.014:
48:
35?
?
0:
00.09ora_dbw0_gaxz
oracle 2443 1 0.014:
48:
35?
?
0:
00.11ora_lgwr_gaxz
oracle 2445 1 0.014:
48:
35?
?
0:
00.41ora_ckpt_gaxz
oracle 2447 1 0.014:
48:
35?
?
0:
00.40ora_smon_gaxz
oracle 2449 1 0.014:
48:
36?
?
0:
00.07ora_reco_gaxz
oracle 2451 1 0.014:
48:
36?
?
0:
00.24ora_cjq0_gaxz
oracle 2453 1 0.014:
48:
36?
?
0:
02.53ora_qmn0_gaxz
oracle 2455 1 0.014:
48:
36?
?
0:
00.06ora_s000_gaxz
oracle 2457 1 0.014:
48:
36?
?
0:
00.07ora_d000_gaxz
HBZW>ps-ef|grep"ora_"|grep-vgrep|awk'{print$2}'
2439
2441
2443
2445
2447
2449
2451
2453
2455
2457
HBZW>ps-ef|grep"ora_"|grep-vgrep|awk'{print$2}'|xargskill-9
HBZW>
2.find命令常用方法
find命令是一个重要的工具,用来查找文件。
下面是列出几个常用的方法:
----当前路径下及所有子目录下查找文件名是netmgr的文件
#find.-namenetmgr
----在/usr及所有子目录下查找名字是vi的文件
#find/usr-namevi
----在当前目录及所有子目录下查找文件名包含net的文件
#find./-name"net*"
----在当前目录及所有子目录查找整个文件名或路径(包含路径)包含特定字符串rdbms的文件或者路径
#find./-print|greprdbms
----查找当前目录及所有目录下的文件的文件内容中含有特定字符串
比如我们要查找当前目录下哪个文件的内容里含有good这个单词:
#find./-print|xargsgrep-igood
总而言之,通过管道符|,将一个命令的输出作为另外一个命令的输入,是Unix下Oracle管理中常用的方法。
========================================================
4Unix服务器环境
本节内容有助于你轻松掌握Unix环境。
本节首先介绍当你作为Oracle用户登录到Unix中会自动被执行的命令。
在主目录下有一个特殊的文件,这个文件中可以写入一些当该用户登录到系统后就自动运行的命令。
如果使用Kornshell,那么文件名就是.profile。
如果使用Cshell,那么文件名就是.cshrc。
1.设置标准Unix提示符(ksh)
将下面的代码放到.profile中,就会得到一个包含服务器名称、数据库名称和当前工作目录的提示符。
这样可以防止我们执行误操作。
PS1="`hostname`*\${ORACLE_SID}-\${PWD}>"
下面是具体的效果:
corphp*PROD-/home/oracle>pwd
/home/oracle
corphp*PROD-/home/oracle>cd/u01/oradata/PROD
corphp*PROD-/u01/oradata/PROD>
在上面的例子中,corphp是主机名,PROD是Oracle实例名,后面跟的是当前目录。
注意,这个方法在ksh下一般都有效,如果是别的shell可能不行。
2.获取Oracle主目录(ksh):
$cat/etc/oratab|grep^$ORACLE_SID:
|cut-f2-d':
'
/poll/oracle/ora92
3.为Oracle创建有用的unix别名
alias命令可以用一个短小的名字来代表一长的Unix命令。
例如:
aliaslog='cd$ORACLE_HOME/$ORACLE_SID/bdump'
rm命令在删除数据的时候默认不确认,这就非常危险,为了避免误删除,我们可以用下面的办法:
aliasrm='rm-i'
这样,执行rm的时候相当于执行的rm-i,就会确认是否删除。
我们可以通过这样的方法,把常用的命令组合用别名来代替,放到.profile文件中。
需要调用的时候调用别名即可。
下面在.profile中定义了一些常用的别名:
#Aliases
#
aliasalert='tail-100\$ORACLE_HOME/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.lo
g|more'aliasarch='cd$ORACLE_HOME/admin/$ORACLE_SID/arch'
aliasbdump='cd$ORACLE_HOME/admin/$ORACLE_SID/bdump'
aliascdump='cd$ORACLE_HOME/admin/$ORACLE_SID/cdump'
aliaspfile='cd$ORACLE_HOME/admin/$ORACLE_SID/pfile'
aliasrm='rm-i'
aliassid='env|grepORACLE_SID'
aliasadmin='cd$ORACLE_HOME/admin'
4.将SQL*Plus脚本放入Unixshell中
这个例子中的脚本叫做run_sql.ksh,该脚本调用了SQL*Plus来执行一条SQL语句,然后执行/home/oracle/sql/longscriptl.sql
#!
/bin/ksh
#请用正确的sid替换下面的sidname
ORACLE_SID=sidname
exportORACLE_SID
ORACLE_HOME=`cat/etc/oratab|grep^$ORACLE_SID:
|cut-f2-d':
'`
exportORACLE_HOME
PATH=$ORACLE_HOME/bin:
$PATH
exportPATH
$ORACLE_HOME/bin/sqlplussystem/manager<
SELECTnameFROMv\$datafile;
@/home/oracle/sql/longscript.sql
exit
!
然后要用chmod755run_sql.ksh来将此脚本改成可执行。
接下来就可以直接在提示符下调用了(假设该脚本位于当前目录下):
#./run_sql.ksh
当然,我们也可以在提示符下用下面的命令来执行SQL*Plus脚本:
#sqlplussystem/manager@/home/oracle/sql/longscript.sql
5.将任务提交到后台执行
nohup命令可以作为一个后台进程来提交任务。
这对长时间执行的Oracle作业尤其有用,因为这可以释放命令提示符,从而你可以进行其他工作。
例如:
nohuprun_sql.ksh>logfile.lst2>&1&
上面这条命令中不光nohup,还有其他内容,让我们来了解一下各部分的含义:
nohup
将这个任务提交,让其持续运行,甚至你断开终端会话。
run_sql.ksh
指定想在后台中运行的Unix脚本
>logfile.lst
指定存放输出的文件名
2>&1
将标准错误信息输入到标准输出设备上。
2代表标准错误信息。
1代表标准输出设备。
&
在后台运行这条命令,释放提示符。
通过在nohup命令的最后加一个空格和ampersand(&
字符,这个命令会以后台任务来运行。
nohup命令会将常用到,因为它避免了当你退出Unix后程序就终止的问题。
6.监控后台运行的进程的执行情况
如果你将后台作业的输出重定向到了一个文件,那么你可以通过tail-f命令来监控后台进程的运行情况。
例如:
tail-flogfile.list
tail-f命令不断的显示输出文件中的新的行,从而让你很轻松的可以看到进程的执行情况。
为了终止tail-f命令,可以随时按下Ctrl-C。
7.确保合适的参数传递给OracleShell脚本
下面的代码展示怎样阻止不合适的参数传递给Oracle的shell脚本。
你可以利用此技术来防止意外的破坏。
在这个例子中,check_param.ksh脚本需要两个参数:
一个OracleSID和一个大于100的数字值。
if语句的作用是条件不满足的时候退出脚本。
#Exitifnofirstparameter$1.
if[-z"$1"]
then
echo"Usage:
check_parms.ksh\
<#_days>(wherevalueis>100)"
exit99
fi
#Exitifnosecondparameter$2.
if[-z"$2"]
then
echo"Usage:
check_parms.ksh\
<#_days>(wherevalueis>100)"
exit99
fi
#Exitifparmisnotgreaterthan100.
tmp=`expr$2`#Convertstringtonumber.
if[$tmp-lt101]
then
echo
echo"Argumenttwoislessthan100.\
AbortingScript."
echo
exit99
fi
echo"Rightpara"
在这个脚本中,$1和$2代表第一个和第二个传递给脚本的参数。
if语句中的-z参数检查是否返回null参数,也就是是否没有输入参数。
头两个if检查是否传递了参数,第3个if检查第二个参数是否大于100。
8.保证只有Oracle用户可以运行脚本
#!
/bin/ksh
if[`whoami`!
='oracle']
then
echo"Error:
Youmustbeoracletoexecute."
exit99
fi
上面的语句只允许oracle用户来执行脚本。
虽然unix文件权限可能允许任何用户来执行,但是经验丰富的DBA应该在脚本上加上限制,只允许oracle用户来运行特定的脚本,如关闭数据库等操作。
9.检查是否传递了正确的SID
这个脚本显示了怎样检查传递的OracleSID是否有效。
这个脚本假设第一个参数是传入的SID,然后检查是否是有效的SID。
接下来脚本会检查/etc/oratab文件,这个文件中会存有有效的SID。
#!
/bin/ksh
#Exitifnofirstparameter$1passed.
if[-z"$1"]
then
echo"PleasepassavalidORACLE_SID\
tothisscript"
exit99
fi
#ValidatetheOracledatabasenamewith
#lookupin/etc/oratab.
TEMP=`cat/etc/oratab|grep\^$1:
|cut-f1-d':
'|wc-l`
tmp=`exprTEMP`#Convertstringtonumber.
if[$tmp-ne1]
then
echo"Yourinput$1isnotavalidORACLE_SID."
exit99
fi
这个脚本可以检查传递的参数是否是有效的OracleSID。
注意,如果你使用Solaris,那么oratab参数文件将是/var/opt/oratab。
另外,有的unix中可能不需要转换TEMP变量。
如果上面的脚本不能运行,那么将tmp=`exprTEMP`语句去掉。
10.理解cat/etc/oratab|grep\^$1:
|cut-f1-d':
'|wc-l的含义
在上面的这个脚本中,对于初次接触unix脚本的人来说最难于理解,所以我们来解释一下。
cat/etc/oratab|
grep\^$1:
|
cut-f1-d':
'|
wc-l
cat/etc/oratab的作用是显示/etc/oratab的全部内容。
#cat/etc/oratab
#
#ThisfileisusedbyORACLEutilities. Itiscreatedbyroot.sh
#andupdatedbytheDatabaseConfigurationAssistantwhencreating
……
*:
/poll/oracle/oracle/OraHome1:
N
*:
/poll/oracle/ora92:
N
gaxz:
/poll/oracle/ora92:
N
grep\^$1:
是在前面的结果中过滤。
$1代表第一个传递的参数的值,\^代表要是1行的开头,总的意思就是,要查找一行的开头是$1和:
的行。
假设$1是gaxz,我们替代一下看看效果:
#cat/etc/oratab|grep\^gaxz:
gaxz:
/poll/oracle/ora92:
N
cut-f1-d':
'的作用是去除掉:
和:
后面的内容:
#cat/etc/oratab|grep\^gaxz|cut-f1-d':
'
gaxz
wc-l的作用是统计前面的内容出现的次数
#cat/etc/oratab|grep\^gaxz|cut-f1-d':
'|wc-l
1
所以可以看出,如果我们将gaxz作为脚本的参数传递,那么将判断是正确的SID
11.在UNIX服务器间的循环操作(LOOP)
Unix的forloop结构可以用来遍历服务器上的某个文件中的所有内容。
例如,你可以写一个Unix脚本来读取oratab文件中的所有内容,并且访问文件中的所有列出的数据库。
进一步利用这个功能,我们可以访问包含你的数据库名称的文件,遍历每一个服务器。
我们可以写一个脚本,访问你的企业环境中的每一个服务器中的每一个数据库。
这个脚本在所有的Unix服务器都是可信任(trusted)的,也就是允许远程脚本命令的时候尤其有用。
Unix的rsh命令可以提交远程脚本命令。
rsh命令通过在.rhosts文件中加入一个条目,允许你访问远程主机。
例如,如果你希望你的Oracle用户允许访问一个远程服务器,名字叫做prodwest,那么prodwest服务器中需要在oracle用户的主目录下有.rhosts文件,如何配置这个文件可以和系统DBA联系。
一般在这个文件中加入++即表示允许其它所有远程用户访问。
如果只允许特定的ip地址访问,可以参考我的.rhosts文件:
#.rhosts
#allowotherservertoremotelyusethisserver
192.168.128.200+
192.168.128.201+
下面是一个访问各个服务器上的数据库的一个示例,这个脚本并不真正做什么,只是显示每个服务器下的oratab文件中的SID。
但是我们可以据此来完善这个脚本。
#Loopthrougheachhostname...
forhostin`cat~oracle/.rhosts|\
cut-d"."-f1|awk'{print$1}'|sort-u`
do
echo""
echo"************************"
echo"$host"
echo"************************"
#Loopthrougheachdatabasename
#/etc/oratab(AIX&HP-UX)or
#/var/opt/oracle/oratabinSolaris.
fordbin`rsh$host\
"cat/etc/oratab|egrep':
N|:
Y'|\
grep-v\*|cut-f1-d':
'"`
do
#GettheORACLE_HOMEforeachdatabase.
home=`rsh$host"cat/etc/oratab|\
egrep':
N|:
Y'|grep-v\*|grep${db}|\
cut-f2-d':
'"`
echo""
echo