linux shell 脚本启动Java总结

linux shell 使用总结

Linux shell对于我们去傻瓜式的去操作一系列的命令非常的方便,比如启动java程序,启动tomact也是通过操作shell来处理的。比如下面操作启动Tomact
由于用户不懂配置处理JDK这些都是需要我们来处理的哦!所以,这样更加的方便用户去操作和使用,同时对于技术支持工程师也是比较的便利。
xxx.sh

export CATALINA_HOME=$(cd `dirname $0`;pwd)
export JAVA_HOME=$(cd `dirname $0`;pwd)/jdk-linux
export JRE_HOME=$(cd `dirname $0`;pwd)/jdk-linux/jre
export JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=256M"
exec bin/startup.sh 

权限要给足够,递归的将124 用户 用户 组其 他人的权限都通通给予

chmod -R 777 *

shell中常用的特殊的字段

  1. $1~$9命令行中的输入参数
  2. $0脚本文件的名称
  3. $* 或者 $@命令行中的所有参数,有区别的。
  4. $$当前的shell脚本进程的Id号码
  5. $? 上一个命令或者函数的返回值
  6. $!最近一次启动后台的进程的ID
    如下就是使用最近一次的后台启动的ID重定向到一个文件中去
    不过这里没有考虑是否已经启动的问题。
SERVER=/home/java/server  
cd $SERVER    
case "$1" in    
  start)  
    nohup java -Xmx128m -jar XXX.jar > $SERVER/server.log 2>&1 &  
    echo $! > $SERVER/server.pid  
    ;;    
  stop)  
    kill `cat $SERVER/server.pid`  
    rm -rf $SERVER/server.pid  
    ;;   
  restart)  
    $0 stop  
    sleep 1  
    $0 start  
    ;;    
  *)  
    echo "Usage: run.sh {start|stop|restart}"  
    ;;    
esac    
exit 0  

shell简单的语法

  1. 定义变量直接写变量的名称value=xxx就行了
  2. 使用变量$value
  3. 使用双引号可以引用除了‘$’、‘`’(这个是反引号~那个键这个不加shfit,不同于引号)、‘\’外的任意的字符串,意思就是要解释这个变量代表的意义。
  4. ‘’’单引号就不允许有变量的替换,而不对它做shell解释。这个和反引号不一样,作者被坑了好久。

命令替换(将字符串的执行结果输出来)

比如定义了一个变量 cmd=”ls -l” 使用两种方式可以执行
1. 使用反引号

echo `$cmd`
value1=`echo $cmd`
  1. 使用$()命令替换,将输出结果给予一个变量或者其他的
value1=$($cmd)

这种反单引号可以解析里面的shell的哦,我之前用的单引号,被坑了很久才发现。

控制结构中的比较test[expression]

可以通过man test查询很多的比较信息,if~else之内的使用很多的额
1. 字符串不为空 -n String
2. 两个字符串比较 String1=String2 相等结果为真 !=
3. 两个表达式算数比较 expression1 -eq expression2 相等结果为真
4. -ne 不相等,-gt大于为真,ge大于等于,lt小于,le小于等于,!expression
5. -d file 这是一个文件为真…..
6. for variable in argument-list
do
做事情
done
7. 函数,直接书写函数名称就是调用啦
funcionname(){
}

后台运行nohup command >/dev/null 2>&1 &

  • 参考网址后台运行
  • 标准输出重定向到 /dev/null (a dummy device that does not record any output)
  • 2>&1 标准出错重定向到标准输出,也到/dev/null

JPS -l (JDK提供的查看运行Java程序的进程号)

  • 利用这个命令我们可以查看当前的程序是否运行,或者找到程序杀死进程。
  • 参考JPS -l 使用网址
  • -l 输出应用程序main class的完整package名 或者 应用程序的jar文件名

su -

输入密码之后,后面的都使用管理员的权限去运行程序。

字符编码问题

  • 由于使用xshell编写bash,在windows上面的编码不正确,导致linux执行错误
  • 怎么查看编码vi xxx.file 命令模式下
  • :set ff? 可以查看当前的是doc还是unix编码
  • set ff=unit处理为unix编码

awk是一个强大的文本分析工具

相对于grep的查找awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)
如果只是显示最近登录的5个帐号,$1 返回的数据的第一个
last -n 5 | awk  '{print $1}'
root
root
root
dmtsai
root

启动一个JAR

  1. 首先判断是否有当前的进程
  2. 启动当前进程
    这里就是“反向单引号使用成了单引号”,shell不解析执行,所以使用了第一个这种方式来展现我们的进程号和JAR的名称。
  3. 或者使用javaps=$JAVA_HOME/bin/jps -l |grep $MAIN_JAR_NAME
    • 检测进程是否存在
#或者 javaps=`$JAVA_HOME/bin/jps -l |grep $MAIN_JAR_NAME`
psid=0
checkpid() {   
   javaps=$(eval "$JAVA_HOME/bin/jps -l |grep $MAIN_JAR_NAME")
   if [ -n "$javaps" ]; then
      psid=`echo $javaps | awk '{print $1}'`
   else
      psid=0
   fi
}
  • 启动进程
start() {
   #检测是否已经启动
   checkpid 
   #不等于0当前已经启动了
   if [ $psid -ne 0 ]; then
      echo "================================"
      echo "warn:  already started! (pid=$psid)"
      echo "================================"
   else
      echo -n "Starting  ..."
      nohup $JAVA_HOME/bin/java $JAVA_OPTS -jar $MAIN_JAR_NAME >/dev/null 2>&1 &     
      checkpid
      if [ $psid -ne 0 ]; then
         echo "(pid=$psid) [OK]"
      else     
         echo "[Failed]"
      fi
   fi
}

可执行JAR

  • Linux下使用java -jar运行可执行jar包的正确方式 网址
  • java命令执行jar包的方式 考虑的问题网址
    首先你需要知道Jar包分为可执行Jar和非可执行Jar,一个可执行的Jar文件是一个自包含的Java应用程序,它存储在特别配置的JAR文件中,可以由JVM直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的JAR中的应用程序,必须将它加入到您的类路径中,并用名字调用应用程序的主类。但是使用可执行的JAR文件,我们可以不用提取它或者知道主要入口点就可以运行一个应用程序。可执行JAR有助于方便发布和执行Java应用程序。

  • 对于可执行Jar,在运行java -jar选项的时候,那么环境变量CLASSPATH和在命令行中指定的所有类路径都将被JVM忽略,也就是说,对于一个可执行Jar,使用java -classpath或者java -cp或者set classpath=lib/commons-io-2.4.jar等等命令指定CLASSPATH都是无效的。

对于一个可执行的JAR必须通过MANIFEST.MF文件的头引用它所需要的所有其他从属JAR,引用方式如下

Manifest-Version: 1.0
Built-By: fuqunqing
Build-Jdk: 1.7.0_65
Class-Path: lib/asm-2.2.3.jar lib/spring-core-3.0.6.RELEASE.jar lib/sp
 ring-asm-3.0.6.RELEASE.jar lib/spring-beans-3.0.6.RELEASE.jar lib/spr
 ing-aop-3.0.6.RELEASE.jar lib/aopalliance-1.0.jar 
Created-By: Apache Maven 3.0.5 
Main-Class: com.XXX.MainClass
Archiver-Version: Plexus Archiver
  • Main-Class是jar文件的主类,程序的入口
  • Class-Path指定需要的jar,多个jar必须要在一行上,多个jar之间以空格隔开,如果引用的jar在当前目录的子目录下,windows下使用\来分割,linux下用/分割文件的冒号后面必须要空一个空格,否则会出错文件的最后一行必须是一个回车换行符,否则也会出错.所以最好在自己的平台打包。

一个完整的标准的启动脚本

#!/bin/sh
#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用,
#也可以作为启动java程序的独立脚本来使用。
#
#Author: tudaxia.com, Date: 2011/6/7
#
#警告!!!:该脚本stop部分使用系统kill命令来强制终止指定的java程序进程。
#在杀死进程前,未作任何条件检查。在某些情况下,如程序正在进行文件或数据库写操作,
#可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本,
#增加在执行kill命令前的一系列检查。
#
#
###################################
#环境变量及程序执行参数
#需要根据实际环境以及Java程序名称来修改这些参数
###################################
#JDK所在路径
JAVA_HOME="/usr/java/jdk"

#执行程序启动所使用的系统用户,考虑到安全,推荐不使用root帐号
RUNNING_USER=root

#Java程序所在的目录(classes的上一级目录)
APP_HOME=/opt/tudaxia/test/WEB-INF

#需要启动的Java主程序(main方法类)
APP_MAINCLASS=com.tudaxia.test.TestMain

#拼凑完整的classpath参数,包括指定lib目录下所有的jar
CLASSPATH=$APP_HOME/classes
for i in "$APP_HOME"/lib/*.jar; do
   CLASSPATH="$CLASSPATH":"$i"
done

#java虚拟机启动参数
JAVA_OPTS="-ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"

###################################
#(函数)判断程序是否已启动
#
#说明:
#使用JDK自带的JPS命令及grep命令组合,准确查找pid
#jps 加 l 参数,表示显示java的完整包路径
#使用awk,分割出pid ($1部分),及Java程序名称($2部分)
###################################
#初始化psid变量(全局)
psid=0

checkpid() {
   javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAINCLASS`

   if [ -n "$javaps" ]; then
      psid=`echo $javaps | awk '{print $1}'`
   else
      psid=0
   fi
}

###################################
#(函数)启动程序
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则提示程序已启动
#3. 如果程序没有被启动,则执行启动命令行
#4. 启动命令执行后,再次调用checkpid函数
#5. 如果步骤4的结果能够确认程序的pid,则打印[OK],否则打印[Failed]
#注意:echo -n 表示打印字符后,不换行
#注意: "nohup 某命令 >/dev/null 2>&1 &" 的用法
###################################
start() {
   checkpid

   if [ $psid -ne 0 ]; then
      echo "================================"
      echo "warn: $APP_MAINCLASS already started! (pid=$psid)"
      echo "================================"
   else
      echo -n "Starting $APP_MAINCLASS ..."
      JAVA_CMD="nohup $JAVA_HOME/bin/java $JAVA_OPTS -classpath $CLASSPATH $APP_MAINCLASS >/dev/null 2>&1 &"
      su - $RUNNING_USER -c "$JAVA_CMD"
      checkpid
      if [ $psid -ne 0 ]; then
         echo "(pid=$psid) [OK]"
      else
         echo "[Failed]"
      fi
   fi
}

###################################
#(函数)停止程序
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则开始执行停止,否则,提示程序未运行
#3. 使用kill -9 pid命令进行强制杀死进程
#4. 执行kill命令行紧接其后,马上查看上一句命令的返回值: $?
#5. 如果步骤4的结果$?等于0,则打印[OK],否则打印[Failed]
#6. 为了防止java程序被启动多次,这里增加反复检查进程,反复杀死的处理(递归调用stop)。
#注意:echo -n 表示打印字符后,不换行
#注意: 在shell编程中,"$?" 表示上一句命令或者一个函数的返回值
###################################
stop() {
   checkpid

   if [ $psid -ne 0 ]; then
      echo -n "Stopping $APP_MAINCLASS ...(pid=$psid) "
      su - $RUNNING_USER -c "kill -9 $psid"
      if [ $? -eq 0 ]; then
         echo "[OK]"
      else
         echo "[Failed]"
      fi

      checkpid
      if [ $psid -ne 0 ]; then
         stop
      fi
   else
      echo "================================"
      echo "warn: $APP_MAINCLASS is not running"
      echo "================================"
   fi
}

###################################
#(函数)检查程序运行状态
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则提示正在运行并表示出pid
#3. 否则,提示程序未运行
###################################
status() {
   checkpid

   if [ $psid -ne 0 ];  then
      echo "$APP_MAINCLASS is running! (pid=$psid)"
   else
      echo "$APP_MAINCLASS is not running"
   fi
}

###################################
#(函数)打印系统环境参数
###################################
info() {
   echo "System Information:"
   echo "****************************"
   echo `head -n 1 /etc/issue`
   echo `uname -a`
   echo
   echo "JAVA_HOME=$JAVA_HOME"
   echo `$JAVA_HOME/bin/java -version`
   echo
   echo "APP_HOME=$APP_HOME"
   echo "APP_MAINCLASS=$APP_MAINCLASS"
   echo "****************************"
}

###################################
#读取脚本的第一个参数($1),进行判断
#参数取值范围:{start|stop|restart|status|info}
#如参数不在指定范围之内,则打印帮助信息
###################################
case "$1" in
   'start')
      start
      ;;
   'stop')
     stop
     ;;
   'restart')
     stop
     start
     ;;
   'status')
     status
     ;;
   'info')
     info
     ;;
  *)
     echo "Usage: $0 {start|stop|restart|status|info}"
     exit 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值