Shell脚本启动程序

Posted 睡到尘间饭熟时

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本启动程序相关的知识,希望对你有一定的参考价值。




这里一些配置先不提,只看shell。首先我们来看PHOME的值:

Shell脚本启动程序

readlink -f :

readlink主要用来找出符号链接所指向的位置。

-f 选项可以递归跟随给出文件名的所有符号链接以标准化,除最后一个外所有组件必须存在。简单地说,就是一直跟随符号链接,直到直到非符号链接的文件位置,限制是最后必须存在一个非符号链接的文件。

例如上图,使用pwd获得当前路径,adis2.0下的目录和使用readlink的不同,这是因为adis-adx2.0-1.0.1-SNAPSHOT-test是adis-adx2.0链接的值。其实我觉得这里从某种角度上看和pwd -P类似。

dirname:

dirname命令去除文件名中的非目录部分,仅显示与目录有关的内容。dirname命令读取指定路径名保留最后一个/及其后面的字符,删除其他部分,并写结果到标准输出。如果最后一个/后无字符,dirname 命令使用倒数第二个/,并忽略其后的所有字符。

ps -eo pid,args:

参数 -e 显示所有进程信息,-o 参数控制输出。Pid和 Args参数显示PID和运行的应用。

执行完该条指令后,我们依次过滤出要启动的应用,端口号(运行脚本时加的参数即端口号)等,然后得到要启动的应用的Pid。

如果pid为空,说明该应用没有运行,则执行最后一条指令,通过调用一个Java类来启动服务。

Shell脚本启动程序

我们先来看一下java -help中对D和cp这两个参数的解释:

Shell脚本启动程序

于是可以知道java -D为设置系统参数,java -cp即是指定类运行所依赖的其他类的路径,通常是类库,jar包等,需要全路径到jar包。其实这里也很好理解,因为我们自己写的Java程序需要运行,就会需要除java.lang包之外的其他类或类库,而使用就是可以指定这些类库或者是类。后面紧跟的,自然就是我们需要执行的启动服务的类,参数即为端口号。

>/dev/null 2>&1 :

其中1表示stdout的标准输出,系统默认值为1,所以>/dev/null 2>&1等同于1>/dev/null 2>&1,2表示stderr标准错误,&在这里表示等同于的意思,所以2>&1,表示2的输出重定向等同于1。所以这里表示标准输出和错误输出都重定向到空设备文件,也就不是输出任何信息到终端,说白了就是不显示任何信息。/dev/null就相当于回收站,只不过是进去了,就再也出不来了。

&:

&放在启动参数后面表示设置此进程为后台进程。默认情况下,进程是前台进程,这时就把Shell给占据了,无法进行其他操作,对于那些没有交互的进程,很多时候,更希望将其在后台启动,可以在启动参数的时候加一个’&’实现这个目的。

说完最后的启动命令我们再来看,如果在进程中看到服务已经启动,将如何重启。

kill -3 <java pid>:查看进程状态。

在网上找关于这个命令的描述特别少,由于很好奇输出成功的堆栈信息是什么样子,就将其打印到run.log中。但是奇怪的是日志里面什么都没有,终端也没有反应,程序也没有被中断。然后找了半天才发现是因为 -Xrs JVM选择没有被使用,于是kill -3命令被忽略了。

解决方法:如果是OpenJDK或者SUNJDK1.6以后的JDK就可以使用jstack -l [java pid] > jstack.out 来达到一样的效果,如下图。

剩下的部分就比较好理解了,需要注意一下的就是sleep后面的参数默认单位是秒,如果要设置秒以上的单位需添加相应的单位(s/m/h)。除此之外就只再说一下kill和kill -9的区别。我们知道kill命令格式为kill -Signal pid。pid是进程号,可以用ps命令查到,signal是发送给进程的信号,TERM(或数字9)表示“无条件终止”。因此 kill - 9 表示强制杀死该进程。而kill有局限性,例如后台进程,守护进程等。



参考

https://blog.csdn.net/new_objectc/article/details/50817893

https://www.cnblogs.com/tinywan/p/6025468.html

https://blog.csdn.net/weakfantasy/article/details/53379501

https://blog.csdn.net/qq_21792169/article/details/50470424




以上是关于Shell脚本启动程序的主要内容,如果未能解决你的问题,请参考以下文章

一个常用的shell启动程序的脚本

Shell脚本启动程序

从 Shell 脚本安装 APK 和启动应用程序 [重复]

shell脚本的if语句,判断某程序是否存在,不存在启动该程序!

Shell脚本启动程序

linux脚本中执行命令