<div id="cnblogs_post_body" class="blogpost-body cnblogs-markdown"> <article class="_2rhmJa"> <p>在本地调试agent相关功能,须要常常性的杀掉Java进程,验证一些极端状况。</p> <p>每次都是本能执行以下步骤</p> <ul> <li>jps</li> <li>kill -9 <pid></li> <li>reboot</li> </ul> <p>有一次验证,发现代码中添加的<code>ShutdownHook</code>没有生效,难道和<code>kill</code>命令后面的数字有关?</p> <p>通过一番查阅,后面的数字表明的是具体信号,<code>kill</code>命令可将指定的信号发送给相应的进程,linux中常见的信号以下:</p> <ul> <li>1 SIGHUP 挂起进程</li> <li>2 SIGINT 终止进程</li> <li>3 SIGGQUIT 中止进程</li> <li>9 SIGKILL 无条件终止进程</li> <li>15 SIGTERM 尽量终止进程</li> <li>17 SIGSTOP 无条件中止进程,但不是终止</li> <li>18 SIGTSTP 中止或者暂停进程,但不终止进程</li> <li>19 SIGCONT 继续运行中止的进程</li> </ul> <p><code>kill</code>命令默认状况使用15,下面咱们验证下使用不一样信号,有什么不一样的表现。</p> <h3>建立一个springBoot应用</h3> <p>启动类以下,添加了一个钩子函数,当进程关闭时,将会调用该钩子函数。</p> <div class="_2Uzcx_"><pre class="line-numbers language-java"><code class="language-java hljs"><span class="token annotation punctuation"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@SpringBootApplication</span></span></span></span> <span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">public</span></span></span></span> <span class="token keyword"><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">class</span></span></span></span></span></span></span><span class="hljs-class"><span class="hljs-class"><span class="hljs-class"> </span></span></span><span class="token class-name"><span class="hljs-class"><span class="hljs-title"><span class="hljs-class"><span class="hljs-title"><span class="hljs-class"><span class="hljs-title">Server</span></span></span></span></span></span></span><span class="hljs-class"><span class="hljs-class"><span class="hljs-class"> </span></span></span><span class="token punctuation">{</span> <span class="token keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">static</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token function"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">main</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(</span></span></span></span></span></span></span><span class="token class-name"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">String</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">[</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">]</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"> args</span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">)</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token punctuation">{</span> <span class="token class-name">SpringApplication</span><span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token class-name">Server</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>java
<span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token function">getRuntime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">addShutdownHook</span><span class="token punctuation">(</span><span class="token keyword"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-keyword">new</span></span></span></span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token annotation punctuation"><span class="hljs-meta"><span class="hljs-meta"><span class="hljs-meta">@Override</span></span></span></span> <span class="token keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token function"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title"><span class="hljs-function"><span class="hljs-title">run</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(</span></span></span></span></span></span></span><span class="token punctuation"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params"><span class="hljs-function"><span class="hljs-params">)</span></span></span></span></span></span></span><span class="hljs-function"><span class="hljs-function"><span class="hljs-function"> </span></span></span><span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string"><span class="hljs-string"><span class="hljs-string"><span class="hljs-string">"do ShutdownHook.......... "</span></span></span></span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span> <span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></div>linux
<p>你能够经过</p> <div class="_2Uzcx_"><pre class="line-numbers language-ruby"><code class="language-ruby hljs">java <span class="token operator">-</span>jar <span class="token operator">~</span><span class="token operator"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">/</span></span></span></span><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">project</span></span></span><span class="token operator"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">/</span></span></span></span><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">web</span></span></span><span class="token operator"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">/</span></span></span></span><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">target</span></span></span><span class="token operator"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">/</span></span></span></span><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">demo</span></span></span><span class="token operator">-</span><span class="token number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1.0</span></span></span></span><span class="token punctuation">.</span>jar <span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></div> <p>也能够加上nohup + &启动</p> <div class="_2Uzcx_"><pre class="line-numbers language-ruby"><code class="language-ruby hljs">nohup java <span class="token operator">-</span>jar <span class="token operator">~</span><span class="token operator"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">/</span></span></span></span><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">project</span></span></span><span class="token operator"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">/</span></span></span></span><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">web</span></span></span><span class="token operator"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">/</span></span></span></span><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">target</span></span></span><span class="token operator"><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">/</span></span></span></span><span class="hljs-regexp"><span class="hljs-regexp"><span class="hljs-regexp">demo</span></span></span><span class="token operator">-</span><span class="token number"><span class="hljs-number"><span class="hljs-number"><span class="hljs-number">1.0</span></span></span></span><span class="token punctuation">.</span>jar <span class="token operator">&</span> <span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></div> <p>经过后者启动,能够看到启动所在的目录多了一个文件nohup.out,该文件记录了应用启动运行过程当中的日志。</p> <p>&表示之后台方式运行应用。但若是退出关闭启动的控制台,进程将会中止。</p> <p>nohup + &也是之后台方式运行应用,可是退出关闭启动的控制台,进程不会中止,且进程日志将会输出到nohup.out中。</p> <h3>kill -3</h3> <p>经过执行jps 拿到对应的pid</p> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 324px; background-color: transparent;"> <div class="image-view" data-width="848" data-height="324"><img data-original-src="//upload-images.jianshu.io/upload_images/2184951-b0864755f1ab57dd.png" data-original-width="848" data-original-height="324" data-original-format="image/png" data-original-filesize="35728" data-image-index="1" style="cursor: zoom-in;" class="" src="https://img2018.cnblogs.com/blog/1112483/201912/1112483-20191207114944159-1513525918.png"></div> </div> <div class="image-caption"></div> </div> <p>并执行 <code>kill -3 5085</code>,惊奇的发现,Java进程并无被杀掉,而是打印了一堆线程信息。</p> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 620px; background-color: transparent;"> <div class="image-view" data-width="2382" data-height="620"><img data-original-src="//upload-images.jianshu.io/upload_images/2184951-a653a4cb75e68549.png" data-original-width="2382" data-original-height="620" data-original-format="image/png" data-original-filesize="252139" data-image-index="2" style="cursor: zoom-in;" class="" src="https://img2018.cnblogs.com/blog/1112483/201912/1112483-20191207115036298-489949244.png"></div> </div> <div class="image-caption"></div> </div> <h3>kill -9</h3> <p>上一步的 <code>kill -3</code> 并无成功的把进程杀掉,咱们继续使用以前的pid。<br> 此次执行 <code>kill -9 5085</code></p> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 92px; background-color: transparent;"> <div class="image-view" data-width="1038" data-height="92"><img data-original-src="//upload-images.jianshu.io/upload_images/2184951-07b4549bd2e9f57c.png" data-original-width="1038" data-original-height="92" data-original-format="image/png" data-original-filesize="15168" data-image-index="3" style="cursor: zoom-in;" class="" src="//upload-images.jianshu.io/upload_images/2184951-07b4549bd2e9f57c.png"></div> </div> <div class="image-caption"></div> </div> <p>执行完 -9,java进程消失了,只留下这么一段话。</p> <h3>kill -15</h3> <p>最后,再试试 <code>kill -15</code>,犹豫Java进程已经被 -9 给kill了,须要从新启动一次。</p> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 400px; background-color: transparent;"> <div class="image-view" data-width="1662" data-height="400"><img data-original-src="//upload-images.jianshu.io/upload_images/2184951-707f86b77a3f379e.png" data-original-width="1662" data-original-height="400" data-original-format="image/png" data-original-filesize="129902" data-image-index="4" style="cursor: zoom-in;" class="" src="https://img2018.cnblogs.com/blog/1112483/201912/1112483-20191207115056944-1890100615.png"></div> </div> <div class="image-caption"></div> </div> <p>这一次,它打印了钩子函数中的信息,随之进程也消失了。</p> <h3>总结</h3> <p>kill -3 <pid> 这玩意通常用不到,能够打印当前进程的线程信息,可是不会关闭Java应用!<br> kill -9 <pid> 很暴力,不会调用钩子函数ShutdownHook。<br> kill <pid> 也就是kill -15 <pid> 很柔和,将会调用钩子函数ShutdownHook,通常ShutdownHook中会进行一些操做,好比保存数据,关闭链接等。</p> 原文地址:https://www.jianshu.com/p/77ca821e7151 </article>web
</div>spring