免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 899 | 回复: 0
打印 上一主题 下一主题

linux shell part2 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-03 15:47 |只看该作者 |倒序浏览
BASH 脚本
脚本要么作为自动进程的一部分被调用(无需人为干预),要么以交互方式运行(用户根据提示执行操作)。只要您拥有文件的执行权限,便可以从命令行键入该文件的名称来运行它。如果您没有文件的执行权限,但拥有其读取权限,则可以通过在脚本的前面加上 sh 来运行该脚本。
如果脚本设计为在无用户输入的情况下运行,则可以使用多种可选方法调用它。可以在后台运行脚本,即使在断开连接的情况下,您仍可以通过输入以下形式的命令来运行:
nohup /path_to_dir/myscript_here.sh &
这对于需要很长时间才能完成的脚本很有用。at 命令可用于在将来执行脚本,而 cron 可用于计划要重复执行的脚本。
以下示例介绍了提供视图输出(使用
echo)、循环、条件逻辑以及变量赋值等重要方面。
print_args.sh参数是位于命令名右侧并传递到脚本中的词。要访问第一个参数,使用 $1 变量。$0 变量包含脚本本身的名称。$# 变量包含脚本中的参数个数。一种迭代所传递的所有参数的便捷方法是使用 while 循环和 shift 命令。该命令使您可以迭代参数列表中的所有参数(而非保持无限循环)。
while [ $# -ne 0
]
do
echo $1
shift
done
如果脚本将文件名作为参数(或提示用户输入文件名)并在后面读取该文件,则建议您检查其访问性和可读性。例如,涉及选择备份控制文件的恢复脚本可能提示用户选择将在脚本后面部分中用于恢复文件的备份控制文件。
if [ !-r $1 ]; then # not exists and is readable
               echo
"File $1 does not exist or is not readable."
               exit;
fi   
字符序列   
if [ !-r $1 ];
是实际执行测试的部分。如果方括号之间的内容结果为 true,则将执行位于 if 和 fi 之间的命令。实际测试显示在方括号之间。惊叹号用于对所执行的测试取反。-r 选项检查文件是否可读。在这个特定示例中所要测试的是传递给脚本的第一个参数。通过使用另一测试 (-d ),可以检查给定条目是否是目录(参见 is_a_directory.sh)。
do_continue.sh该示例是一个可用于读取各种目的的用户输入的简单、典型的命令序列。在运行可能在某些无法从脚本内部确定的条件下导致数据丢失或其他不好结果的进程前,建议您增加一个提示,询问用户是否确实希望脚本执行接下来的命令。以下示例询问用户是否要继续,从命令行读取一个名为 doContinue 的变量并对求解用户的输入。如果用户输入的不是“y”,则告知该用户脚本“将退出”且不执行 if 代码块 (fi) 后的其他脚本。
doContinue=n
echo -n "Do you really want to continue?(y/n)
"
read doContinue
if [ "$doContinue" != "y" ];
then
echo "Quitting..."
exit
fi
只有拥有相应权限和环境的用户才能运行给定脚本。在脚本中检查试图运行脚本的用户很有用。如果将命令括在单引号 (‘) 字符中,则将该命令的结果返回给脚本。以下示例在脚本中使用 whoami 检索当前登录的用户,并稍后使用 date 命令显示日期。      
echo "You are logged in as 'whoami'";
if [ ‘whoami‘ != "oracle" ]; then
echo "Must be logged on as oracle to run this
script."
exit
fi
echo "Running script at ‘date‘"
为与 Oracle 数据库交互而编写的脚本有时需要输入数据库口令等机密信息。stty –echo 命令关闭屏幕响应,这样为随后的读取命令输入的信息就不会显示在屏幕上了。在读取机密信息并将其存储在变量(以下示例中的 pw)中后可以使用 stty echo 重新打开显示。      
stty -echo
  echo
-n "Enter the database system password:
"
        read
pw
stty echo
Oracle 脚本
某些文件位于给定 Oracle 安装的固定位置。可以通过查看 /etc/oraInst.loc 文件获得 Oracle 清单。/etc/oratab
文件标识服务器上安装的数据库(和其他 Oracle 程序)。
get_inv_location.sh该脚本不如前面的示例直观。通过将该脚本划分为几组命令,您将更好的理解该脚本的构成。
要确定清单位置,您将把 cat 命令(显示文件的内容)的结果输送到 grep(一个打印匹配给定模式的行的实用程序)。您将搜索包含文字 inventory_loc 的行。
cat /etc/oraInst.loc | grep inventory_loc
如果因有多个安装而导致存在多个清单位置,则需要排除用 # 注释掉的行。–v 选项排除
包含给定模式的行。
cat /etc/oraInst.loc |grep -v "#"|grep
inventory_loc
该命令的结果将如下所示:
inventory_loc=/u01/oraInventory
可以使用 > 重定向命令将标准输出重定向到一个文件。如果该文件不存在,则创建该文件。如果该文件已存在,则将其覆盖。      
cat /etc/oraInst.loc|grep -v "#"|grep
inventory_loc > tmp
一旦获得表明信息库位置的记录后,您就要删除该记录等号前的部分。这次,您将 cat 命令的结果输送到 awk(一种通常用于拆分可变长度字段的模式扫描和处理语言),这实际上是将字符串标记化。–F 选项指示 awk 将等号用作分隔符。然后,打印该字符串的第二个标记 ($2),它代表等号右侧的所有内容。其结果是我们要找的清单位置 (/u01/oraInventory)。
cat tmp | awk -F= '{print $2}'
由于没有必要保留临时文件 (tmp),因此可以将它删除。
rm tmp
list_oracle_homes.sh如果要确定给定数据库的 ORACLE_HOME,则有多个可选方法。可以数据库用户的身份登录,并对 $ORACLE_HOME 变量执行 echo。还可以搜索 /etc/oratab 文件并选择与给定实例关联的名称。该文件中的数据库条目的形式如下      
$ORACLE_SID:$ORACLE_HOME::
以下单行代码输出条目(ORACLE_SID 为 TESTDB)的 ORACLE_HOME:
cat /etc/oratab | awk -F:'{if
($1=="TESTDB") print $2 }'
但如果如果您需要对
/etc/orainst 文件中列出的每个 ORACLE_HOME 执行操作该怎么办?可以使用以下代码段迭代这样的列表。
dblist='cat /etc/oratab | grep -v "#" |
awk -F:'{print $2 }''
for ohome in $dblist ; do
echo $ohome
done
dblist 变量被用作数组。所有 ORACLE_HOME 路径均由该变量保存。for 循环用于迭代该列表,并将每个条目赋给变量 ohome,然后将其发送到标准输出。
search_log.shOracle 产品生成各种日志,您可能要监视它们。数据库警报日志包含对数据库操作至关重要的消息。当安装或卸载产品以及在应用补丁时也会生成日志文件。以下脚本迭代以参数形式传递给它的文件。如果发现任何包含 ORA- 的行,则向指定的接收者发送电子邮件。     
cat $1 | grep ORA- > alert.err
if [ 'cat alert.err|wc -l' -gt 0 ]
then
mail -s "$0 $1 Errors"
administrator@yourcompany.com      
执行的具体测试是统计文件 alert.err(在您重定向到 alert.err 时写入)中存在的单词数。如果单词数 (wc) 大于 (-gt) 零,则执行 if 代码块。这该示例中,您使用 mail(也可以使用 send mail)发送邮件。邮件标题包含所执行的脚本 ($0)、搜索的日志名称 ($1),邮件正文是与初始搜索 (ORA-) 匹配的行。
可以使用
ORACLE_HOME、ORACLE_BASE 和 ORACLE_SID 等环境变量找到不在 Linux 环境中固定位置的资源。如果管理 Oracle 电子商务套件 11i 应用程序实例,则可以使用许多其他环境变量来定位资源。这些变量包括 APPL_TOP、TWO_TASK、CONTEXT_NAME 以及
CONTEXT_FILE 等。要查看您环境中的完整列表,执行以下命令并查看生成的文件 (myenv.txt):
env > myenv.txt
可以将这些环境变量的各种组合用作所搜索文件的位置。例如,可以将警报日志位置指定为        
$ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log
根据该脚本中引入的原则,可以编写一个更大的脚本并计划定期执行,该脚本将搜索警报日志(或其他所关注的文件)的内容并在发生任何错误时发送电子邮件。然后,可以将日志内容移动到其他文件,这样就只将最新的错误消息通过电子邮件发送。
Oracle Recovery Manager 脚本。Oracle
Recovery Manager (RMAN) 是一个可用于管理数据库备份和恢复的实用程序。由于编写的所有备份脚本都可以由 RMAN 运行,即减少了平台特定的代码数量,因此它明显简化了多个平台的管理。RMAN 可由底层操作系统调用并接受传递来的脚本。例如,冷 (cold.sh) 备份可能由以下脚本组成:        
#!/bin/bash
rman target /      
第 1 行表明您将使用
bash shell。第 2 行调用 Oracle Recovery Manager 并指定 OS 用户登录目标数据库(在环境变量 $ORACLE_SID 中指定)。该行后面的 表示将把随后的命令传递到
RMAN 中去处理。最后一行上的 EOF 表示您已经到了要传递到 RMAN 中的命令序列的结尾。然后,使用 RMAN 关闭数据库、启动并安装数据库并继续备份服务器参数文件和数据库的内容。然后打开数据库。随后删除比保留策略中指定的备份旧的任何备份。参见 RMAN 文档,构建与您的情况相关的备份。
晚间备份通常按计划自动运行。可以使用以下命令调用以上脚本并将标准输出的内容发送到电子邮件地址:
sh cold.sh | mail -s"Backup `date`"
administrator@yourcompany.com
同样,可以从 shell 脚本内部运行其他
Oracle 实用程序。可以使用 tnsping 实用程序查看给定 Oracle 连接标识符能否连接监听器。可以运行该实用程序来检查连接问题:
tnsping ptch04 |grep TNS-
数据库导出和导入(传统的和数据泵)比较适合于编写重复进程脚本。
数据库安装。数据库设置中涉及的许多步骤都可以实现自动化。在 Linux 上安装 Oracle 10g
之前,需要运行各种测试来验证所需的最小程序包版本以及内核参数的设置。可以使用带 –q 选项的 rpm 命令查询程序包的版本。      
rpm -q compat-libstdc++
可以通过查看 /proc“虚拟”或“伪”文件系统确定系统的各个方面。但它不包含实际的文件,而是包含可以查看的运行时系统信息(就好像位于文件中一样)。例如,/proc/meminfo 包含系统的内存信息,而 grep
MemTotal /proc/meminfo 显示系统的内存总量。通过使用 awk(与前面的操作相同),可以分割内存数 (KB),具体方法如下:
grep MemTotal /proc/meminfo | awk '{print $2}'
可以在进行相应的比较和响应(甚至更新系统本身)的脚本上下文中使用这样的命令。示例脚本 10gchecks_kernel.sh 和
10gchecks.sh 只显示基于 Oracle 文档的当前和建议的版本和设置。
数据库监视。可以使用 ps 命令报告进程状态并检查数据库、监听器、脚本或任何其他相关进程是否正在运行。如果要列出服务器上当前运行的所有数据库,可以运行以下命令:     
echo "'ps -ef | grep smon|grep -v grep|awk
'{print $8}'| awk -F \"_\"
'{print$3}'`"
尽管该命令可以正常运行,但一下子理解起来有点困难。第一个命令 ps(使用 -ef 选项获得所有进程的完整列表)查找在服务器上运行的所有进程。第二个命令 grep 搜索 SMON(Oracle System Monitor 后台进程),它显示数据库正在运行。您要删除引用正在运行的 grep 命令的条目。然后,使用 awk 找到列表中的第八列,其中包含 ora_smon_ 形式的系统监视器进程名称。然后,awk 的最后一个实例使用下划线字符作为分隔符来搜索并打印拥有此 SMON 进程的数据库名称。下划线字符需要括在引号中,并在每个引号之前使用一个反斜杠将这些引号转义(因为整个字符串显示在一组双引号中)。
exec_sql.sh正如前面指出的,如果用户拥有 sqlplus 的访问权限,便可以从 shell 脚本中查询数据库。以下示例返回当前在数据库中保持会话状态的计算机列表(由空格分隔):      
#!/bin/bash
output='sqlplus -s "/ as sysdba"
'
echo $output   
因为您将命令输入到其他程序中,所以该脚本类似于前一个 RMAN 脚本。以 sysdba 的身份与数据库建立一个经验证的本地 OS 连接。为防止返回不必要的消息,该脚本关闭 SQL*Plus 的 heading、feedback 和 verify 选项。执行查询并退出 SQL*Plus。
注意视图名称中 $ 之前的双反斜杠。它们是字符串中所需的转义序列:第一个反斜杠转义第二个反斜杠,后者转义 $。尽管并不好看,但却很实用。
正如前面指出的,如果要编写需要广泛数据库访问权限的代码,那么 shell 脚本并不是最佳选择。用 PL/SQL、Perl(使用类似于 shell 脚本中使用的语法)、Python、Java 或随便其他什么语言重写脚本可能会更好。
结论
Shell 脚本是快速自动化重复和易出错管理任务的有效工具。本文提供的示例介绍了可能会出现的可能性,但还远远算不上全面。每个系统都有不同的特征和缺陷以及独特的配置。管理员将开发独特的解决方案来满足特定系统的需要。

               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/20571/showart_270284.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP