Linux编程:Linux Shell 编程实战技能仓酷云
要明白学好linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在使用初期。今朝,愈来愈多的企业使用会部署在Linux体系上的,而LinuxShell剧本能够极年夜地匡助我们完成这些使用的运维义务。这使得LinuxShell开辟妙技成为开辟职员的一项主要的、有合作力的妙技。本文就笔者的实践开辟履历,以KornShell为例分享了剧本开辟中的罕见成绩及相干技能。
制止准时义务剧本的罕见成绩
良多剧本在实践利用的时分常常是以准时义务的体例运转,而非手工运转。可是完成一样功效的剧本在这两种运转体例下大概碰到的成绩不尽不异。
以准时义务体例运转的剧本常常会碰到以下几个成绩。
[*]路径成绩:以后目次常常不是剧本文件地点目次。因而,剧本在援用其利用的内部文件,如设置文件和别的剧本文件时,没法便利得利用绝对路径。
[*]命令找不到成绩:剧本中利用到的一些内部命令,在手工实行剧本的时分能够一般挪用。可是在准时义务下运转则大概呈现剧本剖析器找不到相干命令的成绩。
[*]剧本反复运转成绩:一次剧本的实行未停止,而下一次剧本的运转已入手下手。招致体系中有多个历程在同时运转统一个剧本。
上面分享准时义务剧本开辟中上述几个罕见成绩的处置办法。
路径成绩
准时义务下以后路径常常不是剧本文件地点目次。因而我们必要用相对路径来援用。即先猎取剧本地点目次,然后以该目次为基本接纳相对路径的体例往援用剧本所需的内部文件。办法以下面代码所示。
清单1.猎取剧本文件地点路径
#!/usr/bin/kshecho"Currentpathis:`pwd`"scriptPath=`dirname$0`#猎取剧本地点路径echo"Thescriptislocatedat:$scriptPath"cat"$scriptPath/readme"#利用相对路径援用内部文件
将清单1中的剧本置于目次/opt/demo/scripts/auto-task下,并在cron中增加该剧本。准时义务运转输入以下。
Currentpathis:/home/viscent
Thescriptislocatedat:/opt/demo/scripts/auto-task
命令找不到成绩
准时义务下运转的剧本大概呈现剧本剖析器找不到相干命令的成绩。好比Oracle数据库中的sqlplus命令,剧本在挪用该命令时若没有特别处置则在准时义务下实行会使剧本剖析器没法找到这个命令,呈现以下所示的毛病提醒:
sqlplus:commandnotfound
这是由于剧本在准时义务下实行时剧本是由非登录式Shell来实行的,而且实行剧本的父Shell并不是Oracle用户的Shell。因而,此时Oracle用户的.profile文件并没有被挪用。故办理的办法是在剧本的开首增加以下代码:
清单2.办理找不到内部命令成绩
source/home/oracle/.profile
也就说,关于内部命令找不到的成绩,能够经由过程在剧本的开首加一个source用户的.profile文件的语句来办理。
剧本反复运转成绩
准时义务剧本的别的一个罕见成绩是剧本反复运转的成绩。好比,一个剧本被设置为每5分钟运转一次。若某一次该剧本的运转没法在5分钟内停止的话,准时义务服务仍旧会新启一个历程来实行该剧本。这时候就呈现了运转统一个剧本的多个历程。而这大概招致剧本功效杂乱。而且华侈了体系资本。制止剧本反复运转的办法一般有两种。一是在剧本实行时先反省体系是不是存在运转该剧本的别的历程。若存在,则停止以后剧本的运转。二是,剧本运转时反省体系中是不是存在别的历程运转该剧本。若存在,则停止谁人历程(此办法有必定风险,慎用!)。这两种办法均必要在剧本的开首反省体系是不是已存在运转以后剧本的历程,若存在如许的历程则猎取该历程的PID。示例代码以下清单3所示。
清单3.避免剧本反复运转办法1
#!/usr/bin/kshmain(){selfPID="$$"scriptFile="$0"typesetexistingPidexistingPid=`getExistingPIDs$selfPID"$scriptFile"`if[!-z"$existingPid"];thenecho"Thescriptalreadyrunning,exiting..."exit-1fidoItsTask}#猎取除自己历程之外别的运转以后剧本的历程的PIDgetExistingPIDs(){selfPID="$1"scriptFile="$2"ps-ef|grep"/usr/bin/ksh${scriptFile}"|grep-v"grep"|awk"{if($2!=$selfPID)print$2}"}doItsTask(){echo"Taskisnowbeingexecuted..."sleep20#就寝20s,以摹拟剧本在实行必要长工夫完成的义务}main$*
清单4.避免剧本反复运转办法2
#!/usr/bin/kshmain(){selfPID="$$"scriptFile="$0"typesetexistingPidexistingPid=`getExistingPIDs$selfPID"$scriptFile"`if[!-z"$existingPid"];thenecho"Thescriptalreadyrunning,killingit..."kill-9"$existingPid"#此办法有必定风险,慎用!fidoItsTask}#猎取除自己历程之外别的运转以后剧本的历程的PIDgetExistingPIDs(){selfPID="$1"scriptFile="$2"ps-ef|grep"/usr/bin/ksh${scriptFile}"|grep-v"grep"|awk"{if($2!=$selfPID)print$2}"}doItsTask(){echo"Taskisnowbeingexecuted..."sleep20#就寝20s,以摹拟剧本在实行必要长工夫完成的义务}main$*
回页首
剧本调试技能
固然Shell开辟的一个广泛成绩是调试坚苦,缺少无效的调试工具。可是,我们能够接纳一些可以必定水平上匡助我们躲避调试坚苦的开辟与调试的体例。因为是剧本开辟,很多人习气于从间接地一行行地写代码,一个剧本内里乃至于一个函数都没有。固然这类体例在语法上和功效上并没有成绩。但这增添了调试的难度。相反,假如接纳模块化的体例往编写剧本,则使代码布局明晰、便于调试。这点,能够看如许一个例子。
假定上面的剧本的功效是搜集临盆情况中的相干日记文件,用于定位成绩。必要搜集的日记文件包含操纵体系日记、两头件日记和使用体系自己的日记。这些文件会被紧缩成一个gz文件。
清单5.主动搜集日记文件
#!/usr/bin/kshmain(){collectSyslog#搜集体系日记文件collectMiddlewareLog#搜集两头件日记文件collectAppLog#搜集使用体系日记文件tar-zcflogs.tgzsyslog.zipmdwlog.zipapplog.zip#将三中范例的日记打包,便利下载}
若剧本实行报以下毛病:
tar:applog.zip:Cannotstat:Nosuchfileordirectory
我们能够很快锁定collectAppLog这个函数。由于它卖力输入applog.zip这个文件。而没有需要看代码中的别的部分。
接纳模块化的体例的另外一个优点是代码调试的了局能够牢固上去。好比下面的例子中,假如你已调试好了操纵形态日记搜集的函数。接上去调试别的函数的时分,这些被调试的代码只管大概必要修改。可是这些修改影响到之前已调试好的代码的大概其实不年夜。相反,如果一个剧本中通篇都是语句,而不带函数,则修改个中一行代码,搜集三种日记的功效大概都受影响。
别的一个典范的场景是剧本编写过程当中,我们大概会由于不太断定一些成绩怎样处置而写一些实验性的代码。然后,经由过程重复的调试往确认准确的处置体例。而现实上这些实验性的代码大概就是一条语句乃至一个命令。但很多人是在年夜段的代码中重复往调试这一小段代码。这将十分耗工夫。特别是调试过程当中代码中的别的部分调试时呈现毛病时,作者还得先办理别的毛病,不然大概会时我们真正要调试的代码没法被实行到。这类情况下,专门写一个测试性的小剧本。
在该剧本中调试还我们不太断定该怎样写的代码,怎样将其”集成”到我们正在开辟的剧本中。如许能够进步调试效力,制止损耗本不应损耗的工夫。例如说,我们在编写过程当中必要猎取剧本自己地点历程的历程ID。而此时我们又不太断定这个猎取以后历程id的代码该怎样写。那末,我们能够新建一个测试性的剧本在个中实验完成这个猎取历程ID的功效。找到准确的办法后,将代码“移植”到我们真正要开辟的剧本中。
回页首
处置年夜段字符输入
剧本开辟中常常要处置的一个成绩是输入提醒信息。固然,关于冗长的提醒信息输入,利用echo命令就充足了。可是,关于年夜段的提醒信息输入仍旧利用echo命令处置则显得不敷文雅。一种更合适的办法是利用cat命令分离输出重定向。上面经由过程一个详细例子来讲明这点。
假定上面的剧本会将某个程序安装到用户指定的目次下。若用户指定的目次不存在,则提醒
用户反省指定的目次是不是准确,偏重新实行剧本。
清单6.利用echo命令输入年夜段字符
#!/usr/bin/kshpath="$1"if[!-d"$path"];then#这里还必须处置星号这个特别字符的显现echo****************************************************echoERRORecho"Thedestinationdirectorynotexists,makesurebelowdirectoryyouspecifiediscorrect:"echo${path}echo"Thenre-runthisscript."echo****************************************************fi
这类体例的代码可读性不是很好,浏览者必要浏览多个echo命令然后再举行"综合"才干正确了解提醒信息是甚么。别的,一旦提醒信息必要修改。这类修改大概由于修改个中一个echo命令时不当心多了一个双引号等特别字符而引发语法毛病,从而影响了全部剧本的实行。
清单7的代码则展现了怎样利用cat命令和输出重定一直更好地处置年夜段文本的输入。
清单7.利用cat命令输入年夜段字符
#!/usr/bin/kshpath="$1"if[!-d"$path"];thencat<<EOF****************************************************ERRORThedestinationdirectorynotexists,makesurebelowdirectoryyouspecifiediscorrect:${path}Thenre-runthisscript.****************************************************EOFfi
明显,这类处置体例的代码加倍简便,可读性更好。浏览者只必要看一条命令,就晓得提醒信息的详细内容。而且,若要修正提醒语,我们能够宁神地在两个文件停止符EOF之间的部分改。即使修正错了,也不会影响到代码中的别的部分。
回页首
制止利用非需要的一时文件
老手在编写Shell剧本时常常在不用要利用一时文件的情形下利用了一时文件。这不但增添了而外的代码编写事情量(用于处置创立、读取、和删除一时文件等),并且大概使剧本运转速率变慢(文件I/O究竟不是快的操纵)。
上面的例子中假定有个剧本的功效是往以后目次下一切的.txt文件中增加以下一行文本:
--Endoffilename--
清单8.和清单9.中的代码分离显现了在不用要利用一时文件的情形下利用一时文件的代码和不必要利用一时文件的代码。
清单8.在不用要利用一时文件的情形下利用一时文件
#!/usr/bin/kshls-lt*.txt|awk{print$NF}>tmp#将命令输入重定向光临时文件tmpcattmptypesetfileNametypesetlastLinewhilereadfileName#逐行读取一时文件中的每行dolastLine=`tail-1"$fileName"`if[!"$lastLine"=="--Endof$fileName--"];thenecho"--Endof$fileName--">>$fileNamefidone<tmp#从一时文件举行输出重定向rmtmp#删除一时文件
清单9.不利用一时文件
#!/usr/bin/kshtypesetfileNametypesetlastLineforfileNamein$(ls-lt*.txt|awk{print$NF})dolastLine=`tail-1"$fileName"`if[!"$lastLine"=="--Endof$fileName--"];thenecho"--Endof$fileName--">>$fileNamefidone
回页首
学习linux,就意味着更快的开发效率,等更多关于软件本身或者说操作系统本身的理解。 在学习的过程中,我们用的是VM虚拟机,开始时真的不真的该怎么去做,特别是我的是命令窗口界面,别人的是图形界面,我都不知道怎么调过来。 另外Linux上也有很多的应用软件,安装运行了这些软件后,你就可以在Linux上编辑文档、图?片,玩游戏、上网、播放多媒体文件等。 Windows有MS-DOS?方式,在该方式下通过输入DOS命令来操作电脑;Linux与Windows类似,也有命令方式,Linux?启动后如果不执行?X-WINDOWS,就会处于命令方式下,必须发命令才能操作电脑。? 我感觉linux的学习,学习编程~!~!就去学习C语言编程!! 请问谁有Linux的学习心得的吗?简单的说说? Windows有MS-DOS?方式,在该方式下通过输入DOS命令来操作电脑;Linux与Windows类似,也有命令方式,Linux?启动后如果不执行?X-WINDOWS,就会处于命令方式下,必须发命令才能操作电脑。? 一些显而易见的小错误还是用vi改正比较方便。以后的大一点的程序就得在Linux下调试了,因为有的头文件在VC里面说找不到。? 熟悉系统的基本操作,Linux的图形界面直观,操作简便,多加上机练习就可熟悉操作,在Linux下学习办公软件等常用软件。 对Linux命令熟悉后,你可以开始搭建一个小的Linux网络,这是最好的实践方法。Linux是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web服务器、DNS服务器等都非常完善。 通过自学老师给的资料和向同学请教,掌握了一些基本的操作,比如挂载优盘,编译程序,在Linux环境下运行,转换目录等等。学了这些基础才能进行下面的模拟OS程序。? 把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。 了解Linux的网络安全,系统的安全,用户的安全等。安全对于每位用户,管理员来说是非常重要的。
页:
[1]