这几天在搭建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文本处理的利器,我这里只是日常简单的应用,希望对大家有帮助。