




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
系统管理工具包: 构建无人参与的智能脚本简介: 通过本文了解如何创建脚本来记录其输出、跟踪和标识错误及从错误和问题恢复,从而使其要么正确运行,要么失败并提供合适的错误消息和报告供分析。构建脚本并自动运行是每个好的管理员必须进行的工作,但如何处理错误输出并就脚本应该如何处理这些错误做出明智决策呢?本文将帮助您解决这些问题。关于本系列典型的 UNIX 管理员拥有一套经常用于辅助管理过程的关键实用工具、诀窍和系统。存在各种用于简化不同过程的关键实用工具、命令行链和脚本。其中一些工具来自于操作系统,而大部分的诀窍则来源于长期的经验积累和减轻系统管理员工作压力的要求。本系列文章主要专注于最大限度地利用各种 UNIX 环境中可用的工具,包括简化异构环境中的管理任务的方法。无人参与脚本的问题有很多关于无人参与脚本的问题,所谓无人参与脚本是指通过 cron 之类的服务或 at 命令自动运行的脚本。例如,cron 和 at 命令的默认模式是捕获脚本输出,然后将其通过电子邮件发送到运行脚本的用户。您可能会不希望用户总是收到 cron 缺省发送的电子邮件(特别在一切都正常的情况下)有时候运行脚本的用户和实际负责监视输出的不是同一个人。 因此,您需要更好的方法来跟踪和标识脚本中的错误,需要更好的方法来沟通问题,此外,还需要更好的方法来将结果告知适当的人员。正确设置脚本非常重要;您需要确保脚本得到恰当配置,能够方便地进行维护,而且能够有效地运行。还需要能够跟着错误和程序输出,并需要能够确保脚本的执行环境的安全性和有效性。继续往下阅读,以了解如何进行所有这些工作。 设置环境在使用无人参与的脚本之前,需要确保恰当地设置了环境。作为脚本的一部分,需要对各种元素进行显式配置,花时间进行此工作不仅能够确保脚本正确运行,而且还能够让脚本更易维护。您可能需要考虑的事项包括: 应用程序的搜索路径 库的搜索路径 目录位置 创建目录或路径 公用文件 有些元素非常易于组织。例如,可以在大部分兼容 Bourne 的外壳程序(sh、Bash、ksh 和 zsh)中使用以下命令设置路径: PATH=/usr/bin:/bin:/usr/sbin对于命令和文件位置,请直接在脚本的起始处设置一个对应的变量。然后就可以在要使用文件名的地方使用此变量。例如,当写入到日志文件时,可以使用清单 1。清单 1. 写入日志文件 LOGFILE=/tmp/output.logdo_something $LOGFILEdo_another $LOGFILE 通过设置一次名称,然后使用相应的变量,可以确保不会用错文件名,如果需要更改文件名,也只需要更改一次即可。 使用单个文件名和变量还非常便于创建复杂的文件名。例如,通过使用 date 命令并提供格式规范可更方便地将日期添加到日志文件名中: DATE=date +%Y%m%d.%H%M上面的命令将以 YYYYMMDD.HHMM 格式创建包含日期的字符串,例如,20070524.2359。可以将该日期变量插入文件名中,从而根据日志文件创建的日期对其进行标记。 如果未在日志文件名中使用日期/时间唯一标识符,则最好在两个脚本同时运行的情况下插入其他唯一标识符。如果您的脚本从两个不同的进程写入相同文件,最后可能导致信息会被破坏,或丢失信息。 所有外壳程序都支持唯一外壳程序 ID(基于外壳程序进程 ID),可以通过特殊的 $ 变量名进行访问。通过使用全局日志变量,可以方便地创建用于进行日志记录的唯一文件: LOGFILE=/tmp/$.err还可以将相同的全局变量原则应用于目录: LOGDIR=/var/log/my_app为了确保创建目录,请为 mkdir 使用 -p 选项,以创建希望使用的目录的完整路径: mkdir -p $LOGDIR幸运的是,如果目录已经存在,则此格式不会有任何问题,因而非常适合在无人参与的脚本中运行。 最后,通常最好在无人参与的脚本中使用完整路径名而不是相对路径,从而能将前面的原则与之结合使用。清单 2. 在无人参与的脚本中使用完整路径名 DATE=date +%Y%m%d.%H%MLOGDIR=/usr/local/mcslp/logs/rsynclogmkdir -p $LOGDIRLOGNAME=$LOGDIR/$DATE.log现在已经设置了环境,接下来让我们看看可以如何使用这些原则来帮助处理通用的无人参与脚本。 写入日志文件可能对脚本最简单的改进就是将脚本的输出写入日志文件。您可能认为没有这个必要,但 cron 的缺省操作是保存所执行的脚本或命令的输出,然后将其通过电子邮件发送到拥有 crontab 或负责相关工作的人。 由于多方面的原因,这个方法并不完美。首先,所配置的可能运行脚本的用户可能和需要处理输出的实际人员不是同一个人。您可能会作为 root 运行脚本,不过运行时脚本或命令的输出要送到其他人那里。如果希望将不同命令的输出发送到不同的用户,设置通用筛选器或重定向的方法并不会起作用。第二个原因是更具有根本意义。除非出现错误,否则就没有必要接收脚本的输出。cron 守护程序将发送 stdout 和 stderr 的输出,这意味着即使脚本成功执行,也会得到一个输出副本。 最后的原因是关于生成的信息和输出的管理和组织。电子邮件并非总能够有效地记录和跟踪自动运行的脚本的输出。您可能会只想保存成功的日志文件的存档,或在出现问题时将错误日志的副本以电子邮件方式发送出去。可以采取多种方式进行写入日志文件的工作。最简单的方式是将每个命令的输出重定向到文件中(请参见清单 3)。清单 3. 将输出重定向到文件 cd /sharedrsync -delete -recursive . /backups/shared $LOGFILE如果希望将错误或标准输出组合为单个文件,请使用编号重定向(请参见清单 4)。 清单 4. 将错误和标准输出组合到单个文件中 cd /sharedrsync -delete -recursive . /backups/shared $LOGFILE 2&1清单 4 将信息写入到同一个日志文件中。 您还可能会希望将信息写入到不同的文件中(请参见清单 5)。 清单 5. 将信息写入不同的文件中 cd /sharedrsync -delete -recursive . /backups/shared $LOGFILE 2$ERRFILE对于多个命令的情况下,重定向可能会变得很复杂,而且可能会重复出现。例如,您必须确保是将信息追加(而不是覆盖)到日志文件中(请参见清单 6)。 清单 6. 将信息追加到日志文件 cd /etcrsync -delete -recursive . /backups/etc $LOGFILE $ERRFILE更为简单的方法(如果支持的话)是为一组命令使用内联块,然后作为整体重定向这个块的输出。因此,可以使用清单 8 中的结构覆盖清单 7 中的行。 清单 7. 冗繁的日志记录代码 cd /sharedrsync -delete -recursive . /backups/shared $LOGFILE 2$ERRFILEcd /etcrsync -delete -recursive . /backups/etc $LOGFILE 2$ERRFILE清单 8 显示了分组命令的内联块。清单 8. 使用块进行日志记录 cd /shared rsync -delete -recursive . /backups/shared cd /etc rsync -delete -recursive . /backups/etc $LOGFILE 2$ERRFILE配对括号意味着子外壳,因此块中的所有命令将作为独立进程的一部分执行(尽管没有必要创建外壳,但所包含的块被作为不同逻辑环境对待)。通过使用子外壳,可以对整个块(而不是单个命令)的标准和错误输出进行集体重定向。 跟踪错误并报告子外壳的一个主要优势是,可以对脚本的主要内容进行包装,重定向错误然后发送包含脚本执行状态的具有特定格式的电子邮件。 例如,清单 9 显示了复杂的脚本,将在其中设置环境,执行实际命令和进程的大部分内容,跟踪输出,然后发送包含输出和错误信息的电子邮件。 清单 9. 使用子外壳以电子邮件形式发送更为有用的日志 LOGFILE=/tmp/$.logERRFILE=/tmp/$.errERRORFMT=/tmp/$.fmt set -e cd /shared rsync -delete -recursive . /backups/shared cd /etc rsync -delete -recursive . /backups/etc $LOGFILE 2$ERRFILE echo Reported output echo cat /tmp/$.log echo Error output echo cat /tmp/$.err $ERRORFMT 2&1mailx -s Log output for backup root $ERRLOGif $? -ne 0 then mailx -s Script failed when making directory admin $ERRLOG exit 1fi有时候可以通过使用 & 或 | 符号作为 and、or 或 type 语句,从而使用返回状态代码信息内联。例如,假定您希望确保创建目录并执行命令,但如果未创建目录,则不执行命令。应该使用 if 语句进行此工作(请参见清单 12)。清单 12. 在执行命令前确保目录已创建 mkdir /tmp/outif $? -eq 0 then do_somethingfi可以将清单 12 修改为单个文件: mkdir /tmp/out & do_something上面的语句基本上就是这个意思“创建目录,如果成功完成,则运行目录”。实际上,只有第一个成功完成,才会执行第二个命令。 | 符号的工作方式与此相反;如果第一个命令未成功完成,则执行第二个命令。这对跟踪命令引发错误但还提供了备用解决方案的情况非常有用。例如,当更改到某个目录时,可能会使用以下的代码行: cd /tmp/out | mkdir /tmp/out此代码行尝试更改目录,如果失败(可能由于目录不存在),则创建此目录。另外,还能将这些语句结合在一起使用。当然,在前一个例子中,所希望做的是更改到指定目录,或者如果不存在此目录则进行创建,然后再更改到此目录。可以将此编写为一个代码行: cd /tmp/out | mkdir /tmp/out & cd /tmp/outtrap 命令是用于跟踪更为严重的错误的通用型解决方案,基于命令失败时发出的信号,如内核转储、内存错误或 kill 命令强行终止了命令。 要使用跟踪,可以指定跟踪到信号时执行的命令或函数、要跟踪的信号编号,如此处的清单 13 中所示。清单 13. 跟踪信号 function catch_trap echo killed mailx -s Signal trapped admintrap catch_trap 1 2 3 4 5 6 7 8 9 10 11sleep 9000可以通过这种方式跟踪任何信号,而且也能很好地确保捕获并有效地跟踪和报告程序崩溃的情况。 确定可报告错误在本文中,我们已经了解了跟踪错误、保存输出以及记录问题以便进行处理和报告的各种方法。不过,如果所使用的脚本或命令输出您希望使用和报告但并不总是需要知道的信息,又该如何处理呢? 这个问题解决起来并不容易,但可以使用本文所述的技术的组合来记录错误和信息、读取或筛选信息并相应地对其报告或显示。 进行此工作的一个简单方法是,选择将输出和报告的哪些部分写入日志。或者,可以将日志进行后期处理,以选择或筛选出需要的结果。 例如,假定有一个构建文档的脚本,它在后台使用 Apache 的格式化对象处理器(Formatting Objects Processor,FOP)系统生成文档的 PDF 版本。不过,在进程执行过程中,生成了关于断字的一系列错误。您将看到这些错误,但并不会影响输出质量。在生成文件的脚本中,直接将这行从错误日志中筛选出去即可: sed -e /hyphe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 傅雷家书考试题及答案
- 2025年国家特种设备安全管理人员(A证)考试练习题库(含答案)
- 医养结合人才培训班理论考试题(含答案)
- 医疗机构消毒技术规范培训试题及答案
- 2025心肺复苏理论考试试题(含答案)
- 2025年安全知识竞赛题库及答案
- 2024年农村农业《果树生产技术》知识试题与答案
- 北京培训知识课件
- 2024年事业单位招聘“动物检疫员”职责及技能知识考试题库与答案
- 柴胡种植课件
- 2025年少先队知识竞赛试题库附答案
- 2025年事业单位工勤技能-湖北-湖北防疫员二级(技师)历年参考题库含答案解析(5卷)
- 一键报警管理办法
- GB/T 9775-2025纸面石膏板
- 2024年广州越秀区招聘社区专职工作人员真题
- 防蚊培训课件
- 北方民族大学《高等数学Ⅱ》2025-2026学年期末试卷(A卷)
- 弥漫性大B细胞淋巴瘤病例讨论
- 2025年医院血透室人员培训工作计划
- 2025年公务员考试时政热点必做题(附答案)
- 国企返聘人员管理办法
评论
0/150
提交评论