2013-11-23 80 views
3

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

我现在的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迄今引用。

+1

你是什么意思,它似乎没有工作?究竟是什么问题? –

+0

它总是去启动服务。它不能检测,如果程序已经运行 – Sixthpoint

回答

3

根据你的程序在做什么,可能会有更多或更少智能的方式进行检查。例如,如果你有一些服务器,它将监听一个端口。

然后像

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

可以做的工作。

再有就是lsof,这也可能检测侦听端口。

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

-1

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

+0

当做它想出了运行 – Sixthpoint

+0

麻烦看起来3个工序的p纤ep Java成为未来来自:测试:-eq:一元运算符预期 – Sixthpoint

+0

但是'p纤ep java'是不是有什么你的命令实际上是!您正在寻找一个特定的应用程序!我会这样做'如果[$ cnt -eq 1]'。你需要尝试一些脚本,直到它们正确工作,而不仅仅是运行你的脚本和祈祷。 –

1

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

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

3

Store中的进程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将在重新启动时清零,在这种情况下,所有的权利。

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