在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计划任务就正常了。

修改参考:http://blog.csdn.net/haoren_e/article/details/6043645

  1. #!/bin/sh
  2. # -----------------------------------------------------------------------------
  3. # Start script for the CMGP BOSSCONTROL
  4. #
  5. # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $
  6. # -----------------------------------------------------------------------------
  7. #指定字符集
  8. LANG=zh_CN.GBK export LANG
  9. RUN_HOME=.
  10. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/checking.jar
  11. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar
  12. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar
  13. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar
  14. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar
  15. export CLASSPATH
  16. 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查看环境变量,然后修改脚本如下:

  1. #!/bin/sh
  2. # -----------------------------------------------------------------------------
  3. # Start script for the CMGP BOSSCONTROL
  4. #
  5. # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $
  6. # -----------------------------------------------------------------------------
  7. export PATH=/apps/usr/java/jdk1.5/bin:$PATH
  8. export JAVA_HOME=/apps/usr/java/jdk1.5
  9. export JRE_HOME=/apps/usr/java/jdk1.5/jre
  10. export CLASSPATH=/apps/usr/java/jdk1.5/lib:/apps/usr/java/jdk1.5/jre/lib:$CLASSPATH
  11. RUN_HOME=/apps/service/checking
  12. CLASSPATH=$CLASSPATH$RUN_HOME/lib/checking.jar
  13. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar
  14. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar
  15. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar
  16. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar
  17. export CLASSPATH=$CLASSPATH
  18. java  com.**.checking.Checking_Start >> log.out &

export显示导出为用户环境变量的环境变量 
以上这种jar包是通过eclipse工具export导出,不包含MANIFEST.MF文件,如果使用打包工具Ant,我们可以在打包默认的build.xml文件中设置Class-Path
将第三方jar包加入manifest.mf文件中,且指定程序主类
在build.xml中添加如下内容:

  1. <!-- create a property containing all .jar files, prefix lib/, and seperated with a space -->
  2. <pathconvert property="libs.project" pathsep=" ">
  3. <mapper>
  4. <chainedmapper>
  5. <!-- remove absolute path -->
  6. <flattenmapper />
  7. <!-- add lib/ prefix -->
  8. <globmapper from="*" to="lib/*" />
  9. </chainedmapper>
  10. </mapper>
  11. <path>
  12. <!-- lib.home contains all jar files, in several subdirectories -->
  13. <fileset dir="${lib.dir}">
  14. <include name="**/*.jar" />
  15. </fileset>
  16. </path>
  17. </pathconvert>

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

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

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

  1. Manifest-Version: 1.0
  2. Ant-Version: Apache Ant 1.7.0
  3. Created-By: 1.5.0_09-b01 (Sun Microsystems Inc.)
  4. Implementation-Title: fee task
  5. Implementation-Version: 1.0
  6. Implementation-Vendor: Aspire
  7. Main-Class: com.aspire.cmgp.flowcontrol.server.FlowControlServer
  8. Class-Path: lib/cmgp-util-1.0.1.jar lib/commons-codec-1.3.jar lib/comm
  9. ons-collections.jar lib/commons-dbcp-1.2.1.jar lib/commons-httpclient
  10. .jar lib/commons-logging.jar lib/commons-pool-1.2.jar lib/dom4j.jar l
  11. 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方法所在的类名

shell脚本运行java程序jar的更多相关文章

  1. IDEA部署项目,并结合Shell脚本运行Java程序

    一.概述 在实际开发中,我们写好的代码,往往打成war包或jar包,通过winscp或其他软件将其上传至服务器,然而这样非常大的一个弊端就是不利于开发,为什么这么说呢?假如我们刚刚将springboo ...

  2. shell脚本运行springboot项目jar包

    #!/bin/bash APP_NAME=AutomationGuide-0.0.1-SNAPSHOT.jar #使用说明,用来提示输入参数 usage() { echo "please e ...

  3. shell脚本启动java程序

    #!/bin/bash ### 切换到工作目录 bin=$(cd `dirname ${0}`;pwd) cd ${bin} echo "bin [${bin}] .." ### ...

  4. linux的shell脚本运行python程序

    可以说和windows里的bat是一样的. python3 /opt/pyweibo/get_user_info.py 104501 104502 104503

  5. windows批处理运行java程序

    明确需求 今天你编了一个java swing版照片查看器,想让计算机上的所有照片默认打开方式都改成你的照片查看器. 使用工具软件 很多工具软件都是不把jre打包到exe中的,这就是说打包之后的exe只 ...

  6. 在 Sublime Text 3 中配置编译和运行 Java 程序

    参考网址:http://www.open-open.com/lib/view/open1388105023765.html 1. 设置 java 的 PATH 环境变量 2. 创建批处理或 Shell ...

  7. sh脚本执行Java程序

    1.不引用Jar包或者资源文件夹 最简单的程序Hello World. 首先创建Hello.java public class Hello { public static void main(Stri ...

  8. 在 Sublime Text 2 中编译和运行 Java 程序,以及输出中文出错问题解决办法

    Sublime Text 2 是我最喜欢用来编码的文本编辑器,如果你尝试使用后相信你也会喜欢上它的.在这篇文章中我们将讨论如何在 Sublime Text 2 中编译和运行 Java 程序. 第一步: ...

  9. Java魔法堂:以Windows服务的形式运行Java程序

    一.前言 由于防止维护人员误操作关闭Java控制台程序,因此决定将其改造为以Windows服务的形式运行.弄了一个上午总算搞定了,下面记录下来,以供日后查阅. 二.Java Service Wrapp ...

随机推荐

  1. less 查看日志

    上下键,空格下一页,字母B上一页  ,字母Q退出,n(小写字母n)上一个关键字位置N(大写字母N)下一个关键词位置] 二.查找某个时间段的日志:比如查询2018-08-15 10:37:32到2018 ...

  2. django之model多表操作

    一对多表之间的查询: class userInfo(models.Model): name = models.CharField(max_length=50) password = models.Ch ...

  3. Apache Shiro 快速入门教程,shiro 基础教程

    第一部分 什么是Apache Shiro     1.什么是 apache shiro :   Apache Shiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密,和会话管理 ...

  4. tomcat 启动脚本走过的坑

    最近由于 程序写的问题 tomcat经常需要重启,所以就让我写给监控tomcat并启动的脚本 例: 看着一起正常 然后就写到 crontab 计划任务里了 后来发现不管用, 找了好多文档 就是找不到问 ...

  5. PyCharm:ModuleNotFoundError: No module named 'selenium'

    Mac安装PyCharm后,将已有工程导入,之前使用Mac终端执行脚本时正常,现在报错ModuleNotFoundError: No module named 'selenium',解决方法是在PyC ...

  6. 《C语言程序设计》编程总结汇总

    <C语言程序设计>编程总结汇总 院系: 专业年级: 班级名称: 学号: 姓名: 指导教师: 完成时间: 自我评价: 计算机科学与技术专业教研室 2018 年秋季学期 第四周编程总结 题目4 ...

  7. maven整合ssh框架笔记

    具体工程会上传文件sshpro <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:x ...

  8. 修改postgres密码

    转载自:https://www.cnblogs.com/kaituorensheng/p/4735191.html   1. 修改PostgreSQL数据库默认用户postgres的密码 Postgr ...

  9. Delphi LiveBinds组件

    Component Logo Component Name Description TBindSourceDB Is used for creating bindings to databases. ...

  10. phpize是什么

    安装php(fastcgi模式)的时候,常常有这样一句命令:/usr/local/webserver/php/bin/phpize一.phpize是干嘛的?phpize是什么东西呢?php官方的说明: ...