防止同一个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 &
 
 
同样,配合这个启动脚本的还有一个关闭脚本:
#!/bin/sh 
proc=MyAppMain 
echo  "$proc    进程是否存在" 
    
echo `jps |grep $proc` 
    
proc_id=`jps |grep $proc|awk ' {print $1}'` 
if [ -n  "$proc_id" ] 
then 
                echo  " $proc    is    start,now kill......" 
                 kill -9    $proc_id 
                echo  " $proc    kill         ok !!!!!!!!!!!!!"     
else 
                echo  " $proc    is    not    start!!!!!!!!!!!" 
fi 
 

本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/243360,如需转载请自行联系原作者
相关文章
|
9天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
18天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
20天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
44 2
6种方法打造出色的Shell脚本
|
6天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
17 1
|
7天前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
16 1
|
11天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
25 3
|
11天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
30 2
|
21天前
|
SQL 监控 Java
技术前沿:Java连接池技术的最新发展与应用
本文探讨了Java连接池技术的最新发展与应用,包括高性能与低延迟、智能化管理和监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,为开发者提供了一份详尽的技术指南。
29 7
|
19天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
32 3
|
19天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
36 2