LinuxShell脚本在Java启动容器中的应用

1、Java或Javaweb工程通过自己写的shell脚本启动容器(tomcat,jetty,netty)
2、基本掌握Linux-Java-Shell脚本

a、使用变量
     b、命令行参数
    c、if ... else 语句
    d、case esac语句
    e、for循环
    f、Shell函数
    g、Shell函数参数

一、Java工程通过自己写的shell脚本启动

在看superdiamond的源码的时候,发现是基于netty写的服务端,启动是通过linux的shell脚本来启动的。

启动netty容器,其实就是一个java的main函数,像最初的httpclient启动一个server监听一个端口一样。

将容器(jetty,tomcat)嵌入到工程内部,然后通过Linux的Shell脚本来运行工程,这种方式很好,可以简化程序的部署依赖环境。

于是决定了解一下Linux的Shell脚本。

二、掌握Linux-Java-Shell脚本

2.1 使用变量

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:

1 your_name="mozhiyan"

2 echo $your_name

3 echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:for skill in Ada Coffe Action Java

do

echo "I am good at ${skill}Script"

done

如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号,这是个好的编程习惯。

2.2 命令行参数

运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。
请看下面的脚本: #!/bin/bash

echo "File Name: $0"

echo "First Parameter : $1"

echo "First Parameter : $2"

echo "Quoted Values: [email protected]"

echo "Quoted Values: $*"

echo "Total Number of Parameters : $#"

运行结果:
 $./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
2.3 if ... else 语句

if ... else 语句的语法:if [ expression ]then Statement(s) to be executed if expression is truefi如果 expression 返回 true,then 后边的语句将会被执行;如果返回 false,不会执行任何语句。
最后必须以 fi 来结尾闭合 if,fi 就是 if 倒过来拼写,后面也会遇见。
注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。
举个例子:#!/bin/sh

a=10

b=20

if [ $a == $b ]

then

echo "a is equal to b"

fi

if [ $a != $b ]

then

echo "a is not equal to b"

fi

运行结果:a is not equal to b

2.4 case esac语句

case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。 case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

case 值 in
      模式1) 
         command1
         ;;
     模式2) 
         command2
         command3 
         ;;
     *) 
         command4 
         ;; 
   esac

例:

echo ‘Input a number between 1 to 2‘
echo ‘Your number is:\c‘
read aNum
case $aNum in 
     1) 
      echo ‘You select 1‘ 
      ;; 
     2) 
         echo ‘You select 2‘ 
         ;; 
     *) 
         echo ‘You do not select a number between 1 to 2‘ 
         ;; 
esac

2.5 for循环

for循环一般格式为:for 变量 in 列表
do 
     command1 
     command2 ... commandN
done

例:

for loop in 1 2 3 4 5

do

echo "The value is: $loop"

done 
2.6 Shell函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,Shell 也支持函数。Shell 函数必须先定义后使用。
Shell 函数的定义格式如下:
 function_name () { 
     list of commands 
     [ return value ]
}

例:

#!/bin/bash

# Define your function here

Hello () {

echo "Url is http://see.xidian.edu.cn/cpp/shell/"

}

# Invoke your function  调用函数只需要给出函数名,不需要加括号。

Hello

2.7 Shell函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
带参数的函数示例:

#!/bin/bash

funWithParam(){

echo "The value of the first parameter is $1 !"

echo "The value of the second parameter is $2 !"

echo "The value of the tenth parameter is $10 !"

echo "The value of the tenth parameter is ${10} !"       #注意,$10 不能获取第十个参数,获取第十个参数需要${10}。

echo "The value of the eleventh parameter is ${11} !"  #当n>=10时,需要使用${n}来获取参数。

echo "The amount of the parameters is $# !"  # 参数个数

echo "The string of the parameters is $* !"  # 传递给函数的所有参数

}

funWithParam 1 2 3 4 5 6 7 8 9 34 73
linux脚本学习摘自:http://c.biancheng.net/cpp/view/6994.html

时间: 2024-10-12 09:01:43

LinuxShell脚本在Java启动容器中的应用的相关文章

k8s 集群容器中集成arthas、netstat即时诊断分析工具

背景:k8s 集群中,java应用容器中添加即时工具分析诊断arthas.netstat 1.预先下载好arthas-packaging-3.1.1-bin.zip文件,在Dockerfile同目录下,并且重命名为arthas.zipwget http://repo1.maven.org/maven2/com/taobao/arthas/arthas-packaging/3.1.1/arthas-packaging-3.1.1-bin.zip mv arthas-packaging-3.1.1-

JAVA启动参数整理

http://blog.csdn.net/turkeyzhou/article/details/7619472 java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容: 其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用: 一.标准参数 -client  设置jvm使用client模式

从读取properties文件说开去,浅谈web容器中类加载器

今天刚好有人让我写个通过读取properties连接数据库的小demo. 汗啊,普通项目中可以使用的文件读取,在web项目中总报空指针异常. 查阅了资料明白,赶紧记录下来,希望遇到此类问题的童鞋能引起重视. 废话不说,直接进入主题! 代码清单1: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import java.io.InputStream; import java.util.Properties; import org.apache.log4

如何设置Docker容器中Java应用的内存限制

如果使用官方的Java镜像,或者基于Java镜像构建的Docker镜像,都可以通过传递 JAVA_OPTS 环境变量来轻松地设置JVM的内存参数.比如,对于官方Tomcat 镜像,我们可以执行下面命令来启动一个最大内存为512M的tomcat实例 docker run --rm -e JAVA_OPTS='-Xmx512m' tomcat:8 在日志中,我们可以清楚地发现设置已经生效 "Command line argument: -Xmx512m" 02-Apr-2016 12:46

Spring中基于Java的容器配置(二)

使用@Configuration注解 @Configuration注解是一个类级别的注解,表明该对象是用来指定Bean的定义的.@Configuration注解的类通过@Bean注解的方法来声明Bean.通过调用注解了@Bean方法的返回的Bean可以用来构建Bean之间的相互依赖关系,可以通过前文来了解其基本概念. 注入inter-bean依赖 当@Bean方法依赖于其他的Bean的时候,可以通过在另一个方法中调用即可. @Configuration public class AppConfi

Java Web容器的启动过程

Java web容器的启动与处理请求的过程 1.启动一个web项目的时候,web容器回去读取它的配置文件web.xml,读取<Context-param>结点. 2.容器创建一个servletContext(Servlet上下文),这个web项目的所有部分都将共享这个上下文. 3.容器将<context-param>转换为键值对,并交个ServletContext.因为listener,filter等组件在初始化时会用到这些上下文的信息,所以要先加载. 4.容器创建<list

容器中Java 程序OOMKilled原因浅析

背景: 业务的容器化刚刚搞完,线上开始告警,容器重启,容器重启.describe pod 查看原因是OOMKilled 分析: OOMKilled 是pod 中的进程使用的内存超过了.spec.containers[*].resources.limits.memory中定义的内存限制,在超出限制后, kubernetes 会向容器中的进程(pid=1)发送kill -9 信号.kill -9 信号对于进程来说是不可捕捉的,进程无法在收到-9 信号后优雅的退出. 这对于业务来说是有损的.那么为啥进

docker学习笔记:修改无法启动的容器中的内容

我们可能会碰到这样的一个问题,在容器执行过程中,修改了容器的内容(如配置文件信息),但因为修改出了问题.导致容器关闭后,无法启动. 这事需要重新修改配置文件. 正常情况下可以通过 docker exec命令打开容器的一个shell终端进去修改. 但这时容器已经无法启动了.这时该如何处理呢? 这有两种方案: 方案一:创建新镜像 把这个问题容器用docker commit提交到一个新的镜像,然后用docker run -it 基于新镜像运行一个新的容器进去改变(修复)配置文件. 再通过新的容器再提交

Docker安全--将用户添加到Docker组中进行启动容器与未添加到Docker组中的sudo执行的研究

/*************************************** * Author : Samson * Date : 08/25/2015 * Test platform: * gcc 4.8.2 * GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu) * Docker version 1.7.1 * Debian GNU/Linux 7 * *************************************/ 结论: 对