<h2><span style="font-family: 宋体; font-size: 14px">转载地址:</span><a href="https://www.cnblogs.com/lovychen/p/6211209.html" target="_blank">https://www.cnblogs.com/lovychen/p/6211209.html</a></h2><p><span style="font-family: 宋体; font-size: 14px"><strong><span style="font-size: 18px">根据pid,kill该进程:</span></strong><a href="http://www.cnblogs.com/lovychen/p/5411391.html" target="_blank">http://www.cnblogs.com/lovychen/p/5411391.html</a></span></p><h2>导读</h2><p>Linux 的交互式 Shell 与 Shell 脚本存在一定的差异,主要是由于后者存在一个独立的运行进程,因此在获取进程 pid 上二者也有所区别。</p><h2>交互式 Bash Shell 获取进程 pid</h2><p>在已知进程名()的前提下,交互式 Shell 获取进程 pid 有很多种方法,典型的通过 grep 获取 pid 的方法为(这里添加&nbsp;是为了避免匹配到 grep 进程):</p><p><span style="background-color: #c0c0c0"></span></p><p><span style="background-color: #ffffff">或者不使用&nbsp;(这里名称首字母加的目的是为了避免匹配到 awk 自身的进程):</span></p><p><span style="background-color: #c0c0c0"></span></p><p>如果只使用 x 参数的话则 pid 应该位于第一位:</p><p><span style="background-color: #c0c0c0"></span></p><p>最简单的方法是使用&nbsp;:</p><p><span style="background-color: #c0c0c0"></span></p><p>如果需要查找到 pid 之后 kill 掉该进程,还可以使用&nbsp;:</p><p><span style="background-color: #c0c0c0"></span></p><p>如果是可执行程序的话,可以直接使用&nbsp;</p><p><span style="background-color: #c0c0c0"></span></p><hr/><h2>Bash Shell 脚本获取进程 pid</h2><h4>根据进程名获取进程 pid</h4><p>在使用 Shell 脚本获取进程 pid 时,如果直接使用上述命令,会出现多个 pid 结果,例如</p><table class="highlighttable"><tbody><tr class="firstRow"><td class="linenos"><pre>1 2 3 4 5</pre></td><td class="code" style="word-break: break-all;"><pre>#!&nbsp;/bin/bash #&nbsp;process-monitor.sh process=$1 pid=$(ps&nbsp;x&nbsp;|&nbsp;grep&nbsp;$process&nbsp;|&nbsp;grep&nbsp;-v&nbsp;grep&nbsp;|&nbsp;awk&nbsp;&#39;{print&nbsp;$1}&#39;) echo&nbsp;$pid</pre></td></tr></tbody></table><p>执行&nbsp;&nbsp;会出现多个结果:</p><pre>$&gt;&nbsp;sh&nbsp;process-monitor.sh 3036&nbsp;&nbsp;3098&nbsp;&nbsp;3099</pre><p>进一步排查可以发现,多出来的几个进程实际上是子 Shell 的(临时)进程:</p><pre>root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3036&nbsp;&nbsp;2905&nbsp;&nbsp;0&nbsp;09:03&nbsp;pts/1&nbsp;&nbsp;&nbsp;&nbsp;00:00:45&nbsp;/usr/java/jdk1.7.0_71/bin/java&nbsp;…name root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4522&nbsp;&nbsp;2905&nbsp;&nbsp;0&nbsp;16:12&nbsp;pts/1&nbsp;&nbsp;&nbsp;&nbsp;00:00:00&nbsp;sh&nbsp;process-monitor.sh&nbsp;name root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4523&nbsp;&nbsp;4522&nbsp;&nbsp;0&nbsp;16:12&nbsp;pts/1&nbsp;&nbsp;&nbsp;&nbsp;00:00:00&nbsp;sh&nbsp;process-monitor.sh&nbsp;name</pre><p>其中 3036 是需要查找的进程pid,而 4522、4523 就是子 Shell 的 pid。 为了避免这种情况,需要进一步明确查找条件,考虑到所要查找的是 Java 程序,就可以通过 Java 的关键字进行匹配:</p><table class="highlighttable" style="width: 1113px;" width="904"><tbody><tr class="firstRow"><td class="linenos"><pre>1 2 3 4 5</pre></td><td class="code" style="word-break: break-all;"><pre>#!&nbsp;/bin/bash #&nbsp;process-monitor.sh process=$1 pid=$(ps&nbsp;-ef&nbsp;|&nbsp;grep&nbsp;$process&nbsp;|&nbsp;grep&nbsp;&#39;/bin/java&#39;&nbsp;|&nbsp;grep&nbsp;-v&nbsp;grep&nbsp;|&nbsp;awk&nbsp;&#39;{print&nbsp;$2}&#39;) echo&nbsp;$pid</pre></td></tr></tbody></table><hr/><h4>获取 Shell 脚本自身进程 pid</h4><p>这里涉及两个指令: 1.&nbsp;&nbsp;:当前 Shell 进程的 pid 2.&nbsp;&nbsp;:上一个后台进程的 pid 可以使用这两个指令来获取相应的进程 pid。例如,如果需要获取某个正在执行的进程的 pid(并写入指定的文件):</p><pre>myCommand&nbsp;&amp;&amp;&nbsp;pid=$! myCommand&nbsp;&amp;&nbsp;echo&nbsp;$!&nbsp;&gt;/path/to/pid.file</pre><blockquote><p>注意,在脚本中执行&nbsp;&nbsp;只会显示子 Shell 的后台进程 pid,如果子 Shell 先前没有启动后台进程,则没有输出。</p></blockquote><hr/><h2>查看指定进程是否存在</h2><p>在获取到 pid 之后,还可以根据 pid 查看对应的进程是否存在(运行),这个方法也可以用于 kill 指定的进程。</p><pre>if&nbsp;ps&nbsp;-p&nbsp;$PID&nbsp;&gt;&nbsp;/dev/null&nbsp; then&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;$PID&nbsp;is&nbsp;running&quot;&nbsp;&nbsp;&nbsp; #&nbsp;Do&nbsp;something&nbsp;knowing&nbsp;the&nbsp;pid&nbsp;exists,&nbsp;i.e.&nbsp;the&nbsp;process&nbsp;with&nbsp;$PID&nbsp;is&nbsp;running fi</pre><p><br/></p>