Spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动。其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat)。当然你也可以将项目打包成war包,放到独立的web容器中(Tomcat、weblogic等等),当然在此之前你要对程序入口做简单调整。
项目构建我们使用Maven或Gradle,这将使项目依赖、jar包管理、以及打包部署变的非常方便。
一、内嵌 Server 配置
Spring Boot将容器内置后,它通过配置文件的方式类修改相关server配置。
先看一下下面的图,为关于server的配置列项:
其中常用的配置只有少数几个,已经用紫色标记起来。红框圈起来的部分,看名称分类就可以明白其作用。
对server的几个常用的配置做个简单说明:
<code class="hljs vala has-numbering"><span class="hljs-preprocessor"># 项目contextPath,一般在正式发布版本中,我们不配置</span> server.context-path=/myspringboot <span class="hljs-preprocessor"># 错误页,指定发生错误时,跳转的URL。请查看BasicErrorController源码便知</span> server.error.path=/error <span class="hljs-preprocessor"># 服务端口</span> server.port=<span class="hljs-number">9090</span> <span class="hljs-preprocessor"># session最大超时时间(分钟),默认为30</span> server.session-timeout=<span class="hljs-number">60</span> <span class="hljs-preprocessor"># 该服务绑定IP地址,启动服务器时如本机不是该IP地址则抛出异常启动失败,只有特殊需求的情况下才配置</span> <span class="hljs-preprocessor"># server.address=192.168.16.11</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
Tomcat
Tomcat为Spring Boot的默认容器,下面是几个常用配置:
<code class="hljs ruby has-numbering"><span class="hljs-comment"># tomcat最大线程数,默认为200</span> server.tomcat.max-threads=<span class="hljs-number">800</span> <span class="hljs-comment"># tomcat的URI编码</span> server.tomcat.uri-encoding=<span class="hljs-constant">UTF</span>-<span class="hljs-number">8</span> <span class="hljs-comment"># 存放Tomcat的日志、Dump等文件的临时文件夹,默认为系统的tmp文件夹(如:C:\Users\Shanhy\AppData\Local\Temp)</span> server.tomcat.basedir=<span class="hljs-constant">H</span><span class="hljs-symbol">:/springboot-tomcat-tmp</span> <span class="hljs-comment"># 打开Tomcat的Access日志,并可以设置日志格式的方法:</span> <span class="hljs-comment">#server.tomcat.access-log-enabled=true</span> <span class="hljs-comment">#server.tomcat.access-log-pattern=</span> <span class="hljs-comment"># accesslog目录,默认在basedir/logs</span> <span class="hljs-comment">#server.tomcat.accesslog.directory=</span> <span class="hljs-comment"># 日志文件目录</span> logging.path=<span class="hljs-constant">H</span><span class="hljs-symbol">:/springboot-tomcat-tmp</span> <span class="hljs-comment"># 日志文件名称,默认为spring.log</span> logging.file=myapp.log</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
Jetty
如果你要选择Jetty,也非常简单,就是把pom中的tomcat依赖排除,并加入Jetty容器的依赖,如下:
<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-title">exclusions</span>></span> <span class="hljs-tag"><<span class="hljs-title">exclusion</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-boot-starter-tomcat<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"></<span class="hljs-title">exclusion</span>></span> <span class="hljs-tag"></<span class="hljs-title">exclusions</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-boot-starter-jetty<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">dependencies</span>></span> </code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
打包
打包方法:
CMD进入项目目录,使用 mvn clean package 命令打包,以我的项目工程为例:
<code class="hljs lasso has-numbering">E:<span class="hljs-subst">\</span>spring<span class="hljs-attribute">-boot</span><span class="hljs-attribute">-sample</span><span class="hljs-subst">></span>mvn clean package</code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets_01.png" /></a></div>
可以追加参数 -Dmaven.test.skip=true 跳过测试。
打包后的文件存放于项目下的target目录中,如:spring-boot-sample-0.0.1-SNAPSHOT.jar
如果pom配置的是war包,则为spring-boot-sample-0.0.1-SNAPSHOT.war
二、部署到JavaEE容器
- 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SpringBootSampleApplication</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">SpringBootServletInitializer</span>{</span> <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Logger logger = LoggerFactory.getLogger(SpringBootSampleApplication.class); <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">protected</span> SpringApplicationBuilder <span class="hljs-title">configure</span>(SpringApplicationBuilder builder) { <span class="hljs-keyword">return</span> builder.sources(<span class="hljs-keyword">this</span>.getClass()); } }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
- 修改pom文件中jar 为 war
<code class="hljs xml has-numbering"><span class="hljs-comment"><!-- <packaging>jar</packaging> --></span> <span class="hljs-tag"><<span class="hljs-title">packaging</span>></span>war<span class="hljs-tag"></<span class="hljs-title">packaging</span>></span></code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets_01.png" /></a></div>
- 修改pom,排除tomcat插件
<code class="hljs xml has-numbering"> <span class="hljs-tag"><<span class="hljs-title">dependency</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"><<span class="hljs-title">exclusions</span>></span> <span class="hljs-tag"><<span class="hljs-title">exclusion</span>></span> <span class="hljs-tag"><<span class="hljs-title">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-title">groupId</span>></span> <span class="hljs-tag"><<span class="hljs-title">artifactId</span>></span>spring-boot-starter-tomcat<span class="hljs-tag"></<span class="hljs-title">artifactId</span>></span> <span class="hljs-tag"></<span class="hljs-title">exclusion</span>></span> <span class="hljs-tag"></<span class="hljs-title">exclusions</span>></span> <span class="hljs-tag"></<span class="hljs-title">dependency</span>></span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
- 打包部署到容器
使用命令 mvn clean package 打包后,同一般J2EE项目一样部署到web容器。
三、使用Profile区分环境
spring boot 可以在 “配置文件”、“Java代码类”、“日志配置” 中来配置profile区分不同环境执行不同的结果
1、配置文件
使用配置文件application.yml 和 application.properties 有所区别
以application.properties 为例,通过文件名来区分环境 application-{profile}.properties
application.properties
<code class="hljs avrasm has-numbering">app<span class="hljs-preprocessor">.name</span>=MyApp server<span class="hljs-preprocessor">.port</span>=<span class="hljs-number">8080</span> spring<span class="hljs-preprocessor">.profiles</span><span class="hljs-preprocessor">.active</span>=dev</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets_01.png" /></a></div>
application-dev.properties
<code class="hljs fix has-numbering"><span class="hljs-attribute">server.port</span>=<span class="hljs-string">8081</span></code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
application-stg.properties
<code class="hljs fix has-numbering"><span class="hljs-attribute">server.port</span>=<span class="hljs-string">8082</span></code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets_01.png" /></a></div>
在启动程序的时候通过添加 –spring.profiles.active={profile} 来指定具体使用的配置
例如我们执行 java -jar demo.jar –spring.profiles.active=dev 那么上面3个文件中的内容将被如何应用?
Spring Boot 会先加载默认的配置文件,然后使用具体指定的profile中的配置去覆盖默认配置。
app.name 只存在于默认配置文件 application.properties 中,因为指定环境中不存在同样的配置,所以该值不会被覆盖
server.port 默认为8080,但是我们指定了环境后,将会被覆盖。如果指定stg环境,server.port 则为 8082
spring.profiles.active 默认指定dev环境,如果我们在运行时指定 –spring.profiles.active=stg 那么将应用stg环境,最终 server.port 的值为8082
2、Java类中@Profile注解
下面2个不同的类实现了同一个接口,@Profile注解指定了具体环境
<code class="hljs java has-numbering"><span class="hljs-comment">// 接口定义</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">SendMessage</span> {</span> <span class="hljs-comment">// 发送短信方法定义</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">send</span>(); } <span class="hljs-comment">// Dev 环境实现类</span> <span class="hljs-annotation">@Component</span> <span class="hljs-annotation">@Profile</span>(<span class="hljs-string">"dev"</span>) <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DevSendMessage</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">SendMessage</span> {</span> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">send</span>() { System.out.println(<span class="hljs-string">">>>>>>>>Dev Send()<<<<<<<<"</span>); } } <span class="hljs-comment">// Stg环境实现类</span> <span class="hljs-annotation">@Component</span> <span class="hljs-annotation">@Profile</span>(<span class="hljs-string">"stg"</span>) <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">StgSendMessage</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">SendMessage</span> {</span> <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">send</span>() { System.out.println(<span class="hljs-string">">>>>>>>>Stg Send()<<<<<<<<"</span>); } } <span class="hljs-comment">// 启动类</span> <span class="hljs-annotation">@SpringBootApplication</span> <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProfiledemoApplication</span> {</span> <span class="hljs-annotation">@Value</span>(<span class="hljs-string">"${app.name}"</span>) <span class="hljs-keyword">private</span> String name; <span class="hljs-annotation">@Autowired</span> <span class="hljs-keyword">private</span> SendMessage sendMessage; <span class="hljs-annotation">@PostConstruct</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init</span>(){ sendMessage.send();<span class="hljs-comment">// 会根据profile指定的环境实例化对应的类</span> } }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
3、logback-spring.xml也支持有节点来支持区分
<code class="hljs xml has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="UTF-8"?></span> <span class="hljs-tag"><<span class="hljs-title">configuration</span>></span> <span class="hljs-tag"><<span class="hljs-title">include</span> <span class="hljs-attribute">resource</span>=<span class="hljs-value">"org/springframework/boot/logging/logback/base.xml"</span> /></span> <span class="hljs-tag"><<span class="hljs-title">logger</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"org.springframework.web"</span> <span class="hljs-attribute">level</span>=<span class="hljs-value">"INFO"</span>/></span> <span class="hljs-tag"><<span class="hljs-title">springProfile</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"default"</span>></span> <span class="hljs-tag"><<span class="hljs-title">logger</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"org.springboot.sample"</span> <span class="hljs-attribute">level</span>=<span class="hljs-value">"TRACE"</span> /></span> <span class="hljs-tag"></<span class="hljs-title">springProfile</span>></span> <span class="hljs-tag"><<span class="hljs-title">springProfile</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"dev"</span>></span> <span class="hljs-tag"><<span class="hljs-title">logger</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"org.springboot.sample"</span> <span class="hljs-attribute">level</span>=<span class="hljs-value">"DEBUG"</span> /></span> <span class="hljs-tag"></<span class="hljs-title">springProfile</span>></span> <span class="hljs-tag"><<span class="hljs-title">springProfile</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"staging"</span>></span> <span class="hljs-tag"><<span class="hljs-title">logger</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"org.springboot.sample"</span> <span class="hljs-attribute">level</span>=<span class="hljs-value">"INFO"</span> /></span> <span class="hljs-tag"></<span class="hljs-title">springProfile</span>></span> <span class="hljs-tag"></<span class="hljs-title">configuration</span>></span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
再说一遍文件名不要用logback.xml 请使用logback-spring.xml
四、指定外部的配置文件
有些系统,关于一些数据库或其他第三方账户等信息,由于安全问题,其配置并不会提前配置在项目中暴露给开发人员。
对于这种情况,我们在运行程序的时候,可以通过参数指定一个外部配置文件。
以 demo.jar 为例,方法如下:
<code class="hljs avrasm has-numbering">java -jar demo<span class="hljs-preprocessor">.jar</span> --spring<span class="hljs-preprocessor">.config</span><span class="hljs-preprocessor">.location</span>=/opt/config/application<span class="hljs-preprocessor">.properties</span></code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets_01.png" /></a></div>
其中文件名随便定义,无固定要求。
五、创建一个Linux 应用的sh脚本
下面几个脚本仅供参考,请根据自己需要做调整
start.sh
<code class="hljs bash has-numbering"><span class="hljs-shebang">#!/bin/sh </span> rm <span class="hljs-operator">-f</span> tpid nohup java -jar myapp.jar --spring.config.location=application.yml > /dev/null <span class="hljs-number">2</span>>&<span class="hljs-number">1</span> & <span class="hljs-built_in">echo</span> $! > tpid <span class="hljs-built_in">echo</span> Start Success! </code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
stop.sh
<code class="hljs bash has-numbering"><span class="hljs-shebang">#!/bin/sh</span> APP_NAME=myapp tpid=`ps -ef|grep <span class="hljs-variable">$APP_NAME</span>|grep -v grep|grep -v kill|awk <span class="hljs-string">'{print $2}'</span>` <span class="hljs-keyword">if</span> [ <span class="hljs-variable">${tpid}</span> ]; <span class="hljs-keyword">then</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">'Stop Process...'</span> kill -<span class="hljs-number">15</span> <span class="hljs-variable">$tpid</span> <span class="hljs-keyword">fi</span> sleep <span class="hljs-number">5</span> tpid=`ps -ef|grep <span class="hljs-variable">$APP_NAME</span>|grep -v grep|grep -v kill|awk <span class="hljs-string">'{print $2}'</span>` <span class="hljs-keyword">if</span> [ <span class="hljs-variable">${tpid}</span> ]; <span class="hljs-keyword">then</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">'Kill Process!'</span> kill -<span class="hljs-number">9</span> <span class="hljs-variable">$tpid</span> <span class="hljs-keyword">else</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">'Stop Success!'</span> <span class="hljs-keyword">fi</span> </code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
check.sh
<code class="hljs bash has-numbering"><span class="hljs-shebang">#!/bin/sh</span> APP_NAME=myapp tpid=`ps -ef|grep <span class="hljs-variable">$APP_NAME</span>|grep -v grep|grep -v kill|awk <span class="hljs-string">'{print $2}'</span>` <span class="hljs-keyword">if</span> [ <span class="hljs-variable">${tpid}</span> ]; <span class="hljs-keyword">then</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">'App is running.'</span> <span class="hljs-keyword">else</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">'App is NOT running.'</span> <span class="hljs-keyword">fi</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>
kill.sh
<code class="hljs bash has-numbering"><span class="hljs-shebang">#!/bin/sh</span> APP_NAME=myapp tpid=`ps -ef|grep <span class="hljs-variable">$APP_NAME</span>|grep -v grep|grep -v kill|awk <span class="hljs-string">'{print $2}'</span>` <span class="hljs-keyword">if</span> [ <span class="hljs-variable">${tpid}</span> ]; <span class="hljs-keyword">then</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">'Kill Process!'</span> kill -<span class="hljs-number">9</span> <span class="hljs-variable">$tpid</span> <span class="hljs-keyword">fi</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a target=_blank href="javascript:;"><img src="http://static.blog.youkuaiyun.com/images/save_snippets.png" /></a></div>