Linux下管理java进程

3 篇文章 0 订阅
2 篇文章 0 订阅

Linux下管理java进程

        在一些项目中,经常会用到一些java后台进程,然而如何管理这些java后台进程却是不是很方便。在java中有守护进程的概念,就是运行在后台的线程,而其在java里面的解释是在后台运行的线程,只有当所有的非守护线程都结束的时候,这个守护进程才会结束,这也是管理进程的一个小知识,那么主要管理线程的方法有哪些了?

        一. 可以开启两线程,一个定时扫描,一个是目标线程,扫描线程定时查看目标线程的状态,然后根据自己的业务绣球来管理目标线程。

        二. 我们在学java socket的时候可以知道,我们可以为线程开启监听ServerSocket, 当我们需要关闭进程的时候,我们可以发送报文来改变进程的标志变量,当需要重启进程时,只需要再次发送报文来重置这个标志变量来启动目标进程。

        三.大家都知道每次开启一个进程的时候,操作系统都会为其分配一个唯一标示,就是进程ID,那么我们可以记录这个进程ID,为其管理提供句柄。就像IE的session重拾一样。

        前面两种方法是基本功,也是不太好控制的方法,下面我们来用第三种方法在linux下面实现管理java后台进程,提供开启,关闭功能,当然可以结合linux下面的服务来实现,可以参考本人前篇 “Linux下自启动websphere服务”。

        环境介绍: 系统: linux SUSE,步骤如下:

原理:

(1). 记录进程pid, 写入文件。如 java test & echo $? > pidfile   开启后台进程,并将进程id写入文件。

(2). linux下每开启一个进程会在/proc/下生成一个以pid为名字的文件,该文件记录进程的信息,如cmdline记录了开启该进程的名称,如 java  test 开启的进程, cmdline ="java test", 这样我们可以有效判断该进程是否为我们开启的业务进程。

 

1. 环境变量设置

JAVA_HOME="/opt/IBM/WebSphere7/AppServer/java/bin"
PATH=$JAVA_HOME:$PATH
CLASSPATH=$CLASSPATH:$libDir/log4j-1.2.14.jar
CLASSPATH=$CLASSPATH:$libDir/commons-logging-1.0.4.jar
CLASSPATH=$CLASSPATH:$libDir/AutomaticExecutor.jar:
 
serviceName="AutomaticProcessor"
serviceNameLo="automaticProcessor"
serviceUser="dsas"
serviceUserHome="$appDir"
serviceGroup="dsasgroup"
 

maxShutdownTime=15 pidFile="/var/run/$serviceNameLo.pid"

javaCommand="java" javaClass="AutomaticExecutorConsole" javaArg="$configDir/config.properties $configDir/log4j.properties" javaCommandLine="$javaCommand -classpath $CLASSPATH $javaClass $javaArg" javaCommandLineKeyword="AutomaticExecutorConsole"

 


 

2. 启动脚本

function startService()
{
 getServicePid
 if [ $? -eq 0 ]
       then
         echo "$serviceName is already running"
         rc_failed 0
         rc_status -v
         return 0
 fi

 echo "starting the $serviceName  "
 startServiceProcess
 if [ $? -ne 0 ]
     then 
        rc_failed 1
        rc_status -v 
        return 1
 fi
 rc_failed 0
 rc_status -v

echo "start the $serviceName successfully. "

 return 0

}

 

3. 关闭脚本

function stopService()
{
 getServicePid
 if [ $? -ne 0 ]
      then 
        echo "$serviceName is not running."
        rc_failed 0 
        rc_status -v
        return 0
 fi

 echo "stopping the $serviceName  "
 stopServiceProcess

 if [ $? -ne 0 ]
      then 
        rc_failed 1 
        rc_status -v 
        return 1
 fi


 rc_failed 0
 rc_status -v
echo "stop the $serviceName successfully. "

 return 0

}


 

4. 获取进程Id

function checkProcessIsRunning()
{
 local pid=$1

 if [ -z "$pid" -o $pid -le 0 ]
     then
        return 1
 fi


 if [ ! -e /proc/$pid ]
    then
        return 1
 fi


 return 0
}


function checkProcessIsOurService()
{
 local pid="$1"
 local cmd="$(ps -p $pid --no-headers -o comm)"


 if [ "$cmd" != "$javaCommand" -a "$cmd" != "$javaCommand.bin" ]
      then
       return 1
 fi

/bin/grep -q --binary -F "$javaCommandLineKeyword" /proc/$pid/cmdline

 if [ $? -ne 0 ]
   then
       return 1 
 fi

 return 0
}



function getServicePid()
{
 if [ ! -f $pidFile ]
    then 
     return 1 
 fi

 servicePid="$(<$pidFile)"

 checkProcessIsRunning $servicePid
 if [ $? -ne 0 ] 
     then
         return 1
 fi

 

 checkProcessIsOurService $servicePid
 if [ $? -ne 0 ]
      then
          return 1
 fi

 return 0

}


 

5. 主程序

rc_reset

case "$1" in    start)       startService       ;;    stop)       stopService       ;;     restart)       stopService && startService       ;;    status)       checkServiceStatus       ;;     *)       echo "Usage: $0 {start|stop|restart|status}"       exit 1      ;; esac rc_exit;

 

     这部分工作主要常见于实施过程,也是实施工程师的主要职责,本人刚接触这种业务,所以从零开始学习,最终完成这个小任务,得好好捋捋linux ,shell.


 


function stopService()
{
 getServicePid
 if [ $? -ne 0 ]
      then 
        echo "$serviceName is not running."
        rc_failed 0 
        rc_status -v
        return 0
 fi

 echo "stopping the $serviceName  "
 stopServiceProcess

 if [ $? -ne 0 ]
      then 
        rc_failed 1 
        rc_status -v 
        return 1
 fi


 rc_failed 0
 rc_status -v
echo "stop the $serviceName successfully. "

 return 0

}


 

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值