shell脚本运行java程序jar的方法

在UBuntu上部署项目的时候,我们往往通过一段shell来启动程序,甚至是通过crontab定时任务来定时的调用java程序,但是很奇怪的一个问题就是,比如我写了一个如下的shell脚本:

#!/bin/sh
export mypath=/root/project/wishnomal

java -Xmx3000m -Xms3000m -server -d64 -Dfile.encoding=UTF-8 -Dfetch.threads=300 -classpath $mypath/:$mypath/wish2-assembly-1.0.0.jar newstandard.CrawlerNewStandard $*

echo "END"

手动命令行运行该脚本的时候,可以正常运行java程序,但是使用crontab定时任务,貌似就不起效果了

分析可能原因:

1)是否当前用户对此shell脚本没有可执行权限,通过ls -lrt /apps/service/mtk/checking/run.sh查看脚本是有可执行,但是有执行权限呀-rwxr-xr-x

2)既然单独运行脚本没问题,那会不会是定时的问题呢?于是写了一个简单的输出的shell脚本通过定时也是没问题的。说明还是脚本的问题。

后来上网查了下,想到可能是脚本中环境变量的原因,因为通过crontab运行脚本,是以root用户,而不是当前用户,于是cat /etc/profile查看环境变量,然后修改脚本如下:

分析可能原因:

1)是否当前用户对此shell脚本没有可执行权限,通过ls -lrt /apps/service/mtk/checking/run.sh查看脚本是有可执行,但是有执行权限呀-rwxr-xr-x

2)既然单独运行脚本没问题,那会不会是定时的问题呢?于是写了一个简单的输出的shell脚本通过定时也是没问题的。说明还是脚本的问题。

后来上网查了下,想到可能是脚本中环境变量的原因,因为通过crontab运行脚本,是以root用户,而不是当前用户,于是cat /etc/profile查看环境变量,然后修改脚本如下:

#!/bin/sh
export mypath=/root/project/wishnomal
export JAVA_HOME=/root/lib/jdk1.7.0_72
PATH=$PATH:$JAVA_HOME/bin

java -Xmx3000m -Xms3000m -server -d64 -Dfile.encoding=UTF-8 -Dfetch.threads=300 -classpath $mypath/:$mypath/wish2-assembly-1.0.0.jar newstandard.CrawlerNewStandard $*

echo "END"

export显示导出为用户环境变量的环境变量

这样crontab计划任务就正常了。

修改参考:

#!/bin/sh
# -----------------------------------------------------------------------------
# Start script for the CMGP BOSSCONTROL
#
# $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $
# -----------------------------------------------------------------------------
#指定字符集
LANG=zh_CN.GBK export LANG
RUN_HOME=.
CLASSPATH=$CLASSPATH:$RUN_HOME/lib/checking.jar
CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar
CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar
CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar
CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar 

export CLASSPATH 

java com.**.checking.Checking_Start >> log.out &

手动命令行运行该脚本的时候,可以正常运行java程序,但是使用crontab定时任务,貌似就不起效果了,很是郁闷哪,查原因哪,分析可能原因:

1)是否当前用户对此shell脚本没有可执行权限,通过ls -lrt /apps/service/mtk/checking/run.sh查看脚本是有可执行,但是有执行权限呀-rwxr-xr-x

2)既然单独运行脚本没问题,那会不会是定时的问题呢?于是写了一个简单的输出的shell脚本通过定时也是没问题的。说明还是脚本的问题。

后来上网查了下,想到可能是脚本中环境变量的原因,因为通过crontab运行脚本,是以root用户,而不是当前用户,于是cat /etc/profile查看环境变量,然后修改脚本如下:

#!/bin/sh
# -----------------------------------------------------------------------------
# Start script for the CMGP BOSSCONTROL
#
# $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $
# -----------------------------------------------------------------------------
export PATH=/apps/usr/java/jdk1.5/bin:$PATH
export JAVA_HOME=/apps/usr/java/jdk1.5
export JRE_HOME=/apps/usr/java/jdk1.5/jre
export CLASSPATH=/apps/usr/java/jdk1.5/lib:/apps/usr/java/jdk1.5/jre/lib:$CLASSPATH
RUN_HOME=/apps/service/checking
CLASSPATH=$CLASSPATH$RUN_HOME/lib/checking.jar
CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar
CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar
CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar
 CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar 

export CLASSPATH=$CLASSPATH 

java com.**.checking.Checking_Start >> log.out &

export显示导出为用户环境变量的环境变量

以上这种jar包是通过eclipse工具export导出,不包含MANIFEST.MF文件,如果使用打包工具Ant,我们可以在打包默认的build.xml文件中设置Class-Path

将第三方jar包加入manifest.mf文件中,且指定程序主类

在build.xml中添加如下内容:

<!-- create a property containing all .jar files, prefix lib/, and seperated with a space -->
<pathconvert property="libs.project" pathsep=" ">
  <mapper>
   <chainedmapper>
    <!-- remove absolute path -->
    <flattenmapper />
    <!-- add lib/ prefix -->
    <globmapper from="*" to="lib/*" />
   </chainedmapper>
  </mapper>
   <path>
   <!-- lib.home contains all jar files, in several subdirectories -->
   <fileset dir="${lib.dir}">
   <include name="**/*.jar" />
   </fileset>
   </path>
 </pathconvert> 

另外,在create manifest文件时,加上:

<!-- 这样就可以将第三方jar包加入 -->
<attribute name="Class-Path" value="${libs.project}" />
<!-- 程序运行的主类 -->
<attribute name="Main-Class" value="com.**.checking.Checking_Start " /> 

这样运行ant,打成的jar包中MANIFEST.MF中内容如下:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 1.5.0_09-b01 (Sun Microsystems Inc.)
Implementation-Title: fee task
Implementation-Version: 1.0
Implementation-Vendor: Aspire
Main-Class: com.aspire.cmgp.flowcontrol.server.FlowControlServer
Class-Path: lib/cmgp-util-1.0.1.jar lib/commons-codec-1.3.jar lib/comm
 ons-collections.jar lib/commons-dbcp-1.2.1.jar lib/commons-httpclient
 .jar lib/commons-logging.jar lib/commons-pool-1.2.jar lib/dom4j.jar l
 ib/log4j.jar lib/ojdbc14.jar 

这样在shell脚本中就不需要指定程序所需要的jar包了,也就不存在环境变量设置的恼人问题。比较正规的也是这么操作的。

这样在shell中就直接运行jar包就行了:java -jar 主程序.jar -Xmx1024m -Xms1024m -Xmn512m,

#!/bin/bash后追加

source /etc/profile
source ~/.bash_profile

测试下。。

#! /bin/sh
export JAVA_HOME=/usr/java/jdk1.6.0_18
export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
for i in lib/*.jar;
    do CLASSPATH=$i:${CLASSPATH}
done
export CLASSPATH=.:${CLASSPATH}

java -cp ${CLASSPATH} main方法所在包名.main方法所在的类名

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Shell执行/调用Java/Jar程序例子的实例详解

    Shell执行/调用Java/Jar程序例子的实例详解 前言: 最近要写一个独立的Java程序去监控Hadoop和Oozie,通过Shell去调用.写代码到现在也4年多了,貌似就从来没在生产环境中写过一个独立的Java程序,不是部署到Tomcat就是直接丢给Hadoop.于是参考Hadoop等开源环境,自己写了一个demo,并且可以通过Ant打包生成可运行的程序.所以这里有三步:Java程序,Shell,Ant      1.首先建立Java程序,由于是例子,所以这里很简单,只是输出传入参数的个

  • shell脚本运行java程序jar的方法

    在UBuntu上部署项目的时候,我们往往通过一段shell来启动程序,甚至是通过crontab定时任务来定时的调用java程序,但是很奇怪的一个问题就是,比如我写了一个如下的shell脚本: #!/bin/sh export mypath=/root/project/wishnomal java -Xmx3000m -Xms3000m -server -d64 -Dfile.encoding=UTF-8 -Dfetch.threads=300 -classpath $mypath/:$mypat

  • hadoop运行java程序(jar包)并运行时动态指定参数

    1)首先启动hadoop2个进程,进入hadoop/sbin目录下,依次启动如下命令 [root@node02 sbin]# pwd /usr/server/hadoop/hadoop-2.7.0/sbin sh start-dfs.sh sh start-yarn.sh jps 2)通过jps查看是否正确启动,确保启动如下6个程序 [root@node02 sbin]# jps 10096 DataNode 6952 NodeManager 9962 NameNode 10269 Second

  • PHP执行shell脚本运行程序不产生core文件的方法

    发现一直不产生core文件,但是手动运行脚本的时候就会产生core文件. 经过朋友指导,原来是脚本执行环境导致的问题: 脚本中加入ulimit -a >> 1.log 打印如下: core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 127364 max

  • cmd编译运行java程序的方法

    目录 0.写入程序 1.编译 2.运行 3.将class输出到指定package 4.CLASSPATH 5.常见错误 6.引入jar包 0.写入程序 public class HelloWorld { public static void main(String[] args){ System.out.println("Hello, World!"); } } 1.编译 javac HelloWorld.java -d . javac: java语言的编译器,使用命令行编译Java源

  • Shell脚本运行中的停止方法实现

    Linux系统Shell中提交了一个脚本,但是需要停止这个进程,如何处理? 方式1 killall file-flume-kafka 说明:killall是一个命令,不是kill all,file-flume-kafka是脚本名,此方法简单粗暴. 方式二 ssh $i "ps -ef | grep file-flume-kafka | grep -v grep | awk '{print \$2}' | xargs kill" ps参数: -e:显示所有进程 -f:全格式显示 ps -

  • Linux Crontab Shell脚本实现秒级定时任务的方法

    一.编写Shell脚本crontab.sh #!/bin/bash step=1 #间隔的秒数,不能大于60 for (( i = 0; i < 60; i=(i+step) )); do $(php '/home/www/php/crontab/crontab.php') sleep $step done exit 0 二.crontab -e 输入以下语句,然后:wq 保存退出 # m h dom mon dow command * * * * * /home/www/php/crontab

  • shell脚本实现服务器进程监控的方法

    写作背景: 项目是基于java.weblogic及timer的处理模式,每次服务部署之后timer的整体状态是一个盲区,因为100多个进程,是否有启动遗漏或者启动重复的,想做到一目了然是件困难的事情.所以我考虑用shell脚本的文件查找与匹配方法来解决这个问题,简单记录下,仅供参考. 程序说明: 1)通过将系统定义的进程(timer)配置到配置文件process_signal.config中 2)将服务器当前所有的java进程存储到process_current.txt中 3)逐行读取proce

  • shell脚本无密码登录 expect的使用方法详解

    shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了. 从网上查到使用expect可以,简单研究了一下,效果不错. 因为我的操作系统没有安装expect,所以直接"yum -y install expect",你可以根据你的操作系统安装expect,或者源码编译. 安装好之后就可以使用了,这里有几种方法: 一.单独写一个脚本 如 auto_scp

  • 使用shell脚本一键部署LNMP架构的方法

    LNMP架构介绍 LNMP:Linux系统下Nginx+MySQL+PHP这种网站服务器架构.Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器.Mysql是一个小型关系型数据库管理系统.PHP是一种在服务器端执行的嵌入HTML文档的脚本语言. 原理:浏览器发送http request请求到服务器(Nginx),服务器响应并处理web请求,将一些静态资源(CSS,图片,视频等)保存服务器上,然后将php脚本通过接口传输协议(网关协议)PHP-FCGI

  • Shell脚本函数传递参数的实现方法

    如何传递参数到Shell脚本函数 通常,在其他脚本语言中,您可以将参数和参数作为function_name(parameter1, parameter2,…)传递给函数,这在shell脚本函数中不支持.在shell脚本函数中,您可以在函数调用期间直接传递参数,而无需在函数定义中定义它们的名称,并直接使用位置参数 $1 作为第一个参数, $2 作为第二个参数,以此类推. 在shell脚本中定义函数有两种方法 function function_name { ... } OR function_na

随机推荐