防止同一个Java应用重复启动的shell脚本

通常,一个Java的后台应用程序,在Linux的终端可以启动多个,这样造成资源浪费,甚至相互操作竞争资源导致问题。这里通过也shell脚本启动应用,在shell脚本中做了些限制。就可以巧妙避免重复启动的问题了。

比如应用的目录结构为:

app
        bin(存放启动脚本startup.sh和class文件、配置文件等。)
        lib(存放引用的库)

假设应用的类名为:mypack.MyAppMain

startup.sh

#!/bin/sh
programdir="."
program="mypack.MyAppMain"
num=$#
temp=$CLASSPATH
#setting libs path
libs=../lib/*
append(){
                 temp=$temp":"$1
}
for file in $libs;    do
                 append $file
done
export CLASSPATH=$temp:.:../:$programdir
export LANG=zh_CN
res=`ps aux|grep java|grep $program|grep -v grep|awk '{print $2}'`
if [ -n "$res" ]
      then
                 echo "MyAppMain already running"
else

              nohup java    -classpath $CLASSPATH    mypack.MyAppMain &

              sleep 3
                 unset res
                 res=`ps aux|grep java|grep $program|grep -v grep|awk '{print $2}'`
                 if [ -n "$res" ]
                     then
                          echo "MyAppMain start success"
                     else
                          echo "MyAppMain start error"
                  fi
fi

然后通过此脚本来启动,就可以解决问题了。

注意:

启动时候还可能出现startup.sh没有执行权限的问题,改为777。

还有可能出现错误信息:

: bad interpreter: 没有那个文件或目录

这是因为startup.sh脚本的编码不对,你需要保证文档格式是UNIX的,这个问题好多人栽过跟头,我也不例外,以为shell脚本语法不对,其实是文件编码的问题!

下面给出没有限制的重复启动问题的脚本:

#!/bin/sh
programdir="."
num=$#
temp=$CLASSPATH
#setting libs path
libs=../lib/*
append(){
                 temp=$temp":"$1
}
for file in $libs;    do
                 append $file
done
export CLASSPATH=$temp:.:../:$programdir
export LANG=zh_CN
nohup java    -classpath $CLASSPATH    mypack.MyAppMain &

出处:http://lavasoft.blog.51cto.com/62575/243360

时间: 2025-01-01 23:38:13

防止同一个Java应用重复启动的shell脚本的相关文章

怎样在java代码中调用执行shell脚本呀

问题描述 遇到个问题   在本地压缩服务器上的xml文件 我就想编写shell教本 脚本内容是链接服务器 找到待压缩文件 压缩文件  说实话 我不知道这样是否可行  试试  但我不知道怎样在java代码中 调用执行shell脚本  谁能指点指点  求教...  问题补充:首先谢谢各位朋友的回答  在补充个小问题 <br />能在调用shell脚本时 同时给shell脚本传参数吗  不止一个 能这样写吗     <br />Runtime.getRuntime().exec(&quo

怎么通过java去调用并执行shell脚本以及问题总结

该文章来自阿里巴巴技术协会(ATA)精选集 背景 我们在开发过程中,大部分是java开发, 而在文本处理过程中,主要就是脚本进行开发. java开发的特点就是我们可以很早地进行TDDL, METAQ 等等地对接: 而脚本开发的特点就是在进行批处理的时候非常方便. 前阵子我遇到这么一个需求场景: 对抓取的数据进行打包, 后来又遇到我要通过脚本进行抓取,比如nodejs下基于phantomjs的casperjs爬虫. 解决方法 对于第一个问题:java抓取,并且把结果打包.  那么比较直接的做法就是

tomcat-JAVA连接远程服务器执行shell脚本启动TOMCAT权限问题

问题描述 JAVA连接远程服务器执行shell脚本启动TOMCAT权限问题 JAVA本地连接远程linux服务器执行shell脚本提示:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program 注:脚本在服务器可以运行,连接用的也是root账户,是不是权限问题,还是其他

linux下的shell命令的编写,以及java如何调用linux的shell命令(java如何获取linux上的网卡的ip信息)

程序员都很懒,你懂的! 最近在开发中,需要用到服务器的ip和mac信息.但是服务器是架设在linux系统上的,对于多网口,在获取ip时就产生了很大的问题.下面是在windows系统上,java获取本地ip的方法.贴代码: package com.herman.test; import java.net.InetAddress; /** * @see 获取计算机ip * @author Herman.Xiong * @date 2014年5月16日 09:35:38 */ public class

linux 下shell脚本调用 (小白求教)

问题描述 linux 下shell脚本调用 (小白求教) Shell脚本怎么实现调用一个可执行文件并在脚本中执行该文件中的命令? (可执行文件打开后是命令行模式) 解决方案 啥意思?脚本里调用脚本?直接以廖本名调用啊 解决方案二: 这个是不是类似,在shell命令行窗口中打开另外一个命令行? 解决方案三: 用fork,system等,可以获取它的管道输出等 解决方案四: 文件中的命令? 没明白什么意思? 解决方案五: 可以尝试使用source函数................. 解决方案六:

一键启动集群的shell脚本

一键启动集群的shell脚本,包括HDFS HA + YARN相关所有程序,FBI00X是主机名,供大家参考: #!/bin/bash echo "-------------------------Step1----------------------------" echo "Now,starting Zookeeper." ssh FBI001 $ZOOKEEPER_HOME/bin/zkServer.sh start ssh FBI002 $ZOOKEEPER

防止.net中重复启动的方法

重复   重复启动的问题有时候很让人头疼,特别是服务端Socket端口,需要注册,当你启动服务程序,那么该端口就被注册了,如果再次启动,明显会对已经启动的应用程序产生威胁 如果我们能有个方法,当应用程序加载的时候,发现该程序已经运行,就关闭该程序 private static void CheckRunning()  {   int ProceedingCount = 0;   System.Diagnostics.Process[] Processes;   Processes = Syste

java运行shell脚本方法示例

 利用Runtime.execute方法,我们可以在Java程序中运行Linux的Shell脚本,或者执行其他程序   现在通过CommandHelper.execute方法可以执行命令,该类实现   代码如下: package javaapplication3; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /**  *  * @author chensh

java中关于启动一个线程的问题

问题描述 java中关于启动一个线程的问题 start( )方法是不是只能用于启动可以线程,还有什么其他方面的用法吗 解决方案 start仅仅是运行线程的run方法而已 解决方案二: 你的意思是..想问start()这个方法在其他地方有没有同名的方法?还是想问,还有没有其他方法能启动线程? 解决方案三: java新建一个线程 解决方案四: Thread的start方法就是启动线程的,但是别的类的这个方法是什么作用就不一定了.