检查jar是否从shell运行

时间:2013-11-23 21:47:12

标签: java shell sh executable-jar

我有一个java jar程序,我试图在我的机器启动时运行。理想情况下,shell脚本将每60秒检查一次,以确保jar正在运行。如何检查jar是否在centos上运行,这似乎不起作用?

我当前的.sh文件:

#!/bin/bash

while [ true ]
do
    cnt=`ps -eaflc --sort stime | grep /home/Portal.jar |grep -v grep | wc -l`
    if(test $cnt -eq 3);
    then
        echo "Service already running..."
    else
        echo "Starting Service"
        java -jar /home/Portal.jar >> /dev/null &
    fi
    sleep 1m
done

到目前为止,我使用this进行了引用。

7 个答案:

答案 0 :(得分:3)

将您的流程ID存储在文件中并检查此过程。

#!/bin/bash

while [ true ]
do
    pid=$(cat /tmp/portal.pid)
    if [[ -n "$pid" && $(ps -p $pid | wc -l) -eq 2 ]]
    then
        echo "Service already running..."
    else
        echo "Starting Service"
        java -jar /home/Portal.jar >> /dev/null &
        echo $! > /tmp/portal.pid
    fi
    sleep 1m
done

/tmp将在重启时被清除,在这种情况下就可以了。

答案 1 :(得分:3)

根据您的程序执行的操作,可能会有或多或少的智能方法来检查它。例如,如果您有一些服务器,它将侦听端口。

然后像

netstat -an | fgrep tcp | fgrep LISTEN | fgrep :87654   # or whatever your port is

可以胜任。

然后有lsof,它还可以检测侦听端口。

最后,您可以连接并发出伪请求。例如,对于http服务器,您可以使用lynxcurl。对于具有非stamdard协议的服务器,您可以编写一个小型客户端程序,其唯一目的是连接到服务器,以查看它是否存在。

答案 2 :(得分:1)

几个月前,我做了同样的事情。我的任务是确保jar分布式java程序在Linux服务器上全天候运行。 我的程序基于控制台,启动,做了一些事情然后停止了。 我做了一个启动的shell脚本,等待结束,然后在无限循环中重新启动应用程序。 我安装了 runit ,创建了一个服务并提供了这个脚本作为运行脚本。效果很好。 通常,shell脚本确保java程序正在运行,runit确保启动脚本(我们的脚本)正在运行。

您可以在此处找到有价值的信息:http://smarden.org/runit/faq.html

答案 3 :(得分:0)

我宁愿让它退出,而是让它退出并使用crontab每1分钟运行一次;这将检查它是否正在运行,或者只是停止脚本。

#!/bin/sh
declare -a devId=( "/Path/To/TestJar.jar Test1" "/Path/To/TestJar.jar Test2" ) #jarfile with pathname and Test as argument
# get length of an array
arraylength=${#devId[@]}
# use for loop to read all values and indexes
for (( i=1; i<${arraylength}+1; i++ ));
do
y=${devId[$i-1]}
cnt=`ps -eaflc --sort stime | grep "$y" |grep -v grep | wc -l`
if [ $cnt = 0 ]
then
java -jar $y& > /dev/null
b=$(basename $y)
echo $b 
#DO SOME OPERATION LIKE SEND AN EMAIL OR ADD TO LOG FILE
continue
elif [ $cnt != 0 ]
then
echo 'do nothing'
fi
done

答案 4 :(得分:0)

您可以使用jps命令。它返回在系统中运行的JVM。

答案 5 :(得分:0)

我创建了以下脚本来监视我的应用程序jar是否运行。 在这种情况下,我的应用程序jar在端口8080上运行

#!/bin/bash
check=$(netstat -an | grep 8080 | wc -l)
if [[ $check -eq 0 ]];then
    echo "jar is not running..."
    /usr/bin/java -jar /path/to/target/application.jar >> /dev/null &
else
    echo "it is running"
fi

我正在使用cronjob通过每分钟执行一次shell脚本来监视jar应用程序。

$ crontab -e

文件末尾

* * * * * /bin/bash monitor-jar.sh /dev/null 2>&1

答案 6 :(得分:-1)

为什么您认为$cnt应该等于3?如果进程已在运行,它不应该等于1吗?