这几天在搭建flume服务并在其框架下开发,反复调试输入命令让人不厌其烦,因此在这里记录一下自己找到的一些小技巧:

首先,把自己的应用程序做成一个service是一个很好的选择,一个service就需要支持start 和 stop,start能启动程序,stop能找到start所启动的程序的进程并且关掉它。

可以直接根据/etc/init.d/下的服务脚本来改,但我遇到了问题:因为那些系统服务脚本都是基于start-stop-daemon命令,这个命令很强大,可以启动一个可执行文件并且把进程PID,写入指定的文件里,这样在停止进程时可以直接读取文件来关掉进程。

但我用这个命令来启动自己的程序时,程序启动成功,但是PID文件在无任何错误信息的情况下就是没法生成,测试了root权限执行,也测试了各种写入路径(不需要高权限的),统统不行,于是决定慢慢研究这个问题的同时,先用简单的方法去解决我的需求。


启动程序很简单,作为服务,需要后台运行,假设你的可执行文件名叫做PROGRAM。

所以启动就需要  :

nohup PROGRAM [args] &

要关闭就需要    :

#PROGRAM是进程名

PID = `pidof PROGRAM`

if [ ! -z "$PID" ]; then
     kill -15 $PID
     fi


但是对于java或者python 程序,进程是java或者python,没有可区分度,所以不能用"pidof"命令,那么只能用"ps -ef"命令,用grep对进程信息进行过滤,来找到合适的进程


而一台机器上可以有多个flume服务,每个服务可能就执行参数有一些区别,所以要用多个grep:

  PID=`ps -ef | grep java | grep flume | awk '{ print $2 }'`
     if [ ! -z "$PID" ]; then
     kill -15 $PID
     fi

这里用到了awk命令,取出了"ps"命令打印信息的第二列PID的值。


这样一个简单服务的start和stop就完成了。


我还遇到另一个需求,就是检查某端口的占用情况,并且强制关闭占用这个端口的进程:

# netstat -tlnpa | grep 44444
tcp6       0      0 10.58.242.18:44444      :::*                    LISTEN      25049/java

端口查询结果有如上格式,那么我们可以根据这个格式编写如下脚本:

pinfo=`netstat -tlnpa | grep 44444`

PID=`awk '{split("'$pinfo'", array, "/");print array[2]}' `

if [ ! -z "$PID" ]; then
     kill -15 $PID
     fi

就搞定了。

深入挖掘awk 和 grep 还可以有很多用处,作为shell文本处理的利器,我这里只是日常简单的应用,希望对大家有帮助。

Logo

更多推荐