| 后一修订版 | 前一修订版 | ||
|
服务器技术:sheel:bash_shell_获取进程_pid [2018/06/07 09:01] admin 创建 |
服务器技术:sheel:bash_shell_获取进程_pid [2018/09/10 18:02] (当前版本) |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | <h2><span style="font-family: 宋体; font-size: 14px">转载地址:<a href="http://weyo.me/pages/techs/linux-get-pid/">http://weyo.me/pages/techs/linux-get-pid/</a></span></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>在已知进程名(<code>name</code>)的前提下,交互式 Shell 获取进程 pid 有很多种方法,典型的通过 grep 获取 pid 的方法为(这里添加 <code>-v grep</code>是为了避免匹配到 grep 进程):</p><p><span style="background-color: #c0c0c0"><code>ps -ef | grep "name" | grep -v grep | awk '{print $2}'</code></span></p><p><span style="background-color: #ffffff">或者不使用 <code>grep</code>(这里名称首字母加<code>[]</code>的目的是为了避免匹配到 awk 自身的进程):</span></p><p><span style="background-color: #c0c0c0"><code>ps -ef | awk '/[n]ame/{print $2}'</code></span></p><p>如果只使用 x 参数的话则 pid 应该位于第一位:</p><p><span style="background-color: #c0c0c0"><code>ps x | awk '/[n]ame/{print $1}'</code></span></p><p>最简单的方法是使用 <code>pgrep</code>:</p><p><span style="background-color: #c0c0c0"><code>pgrep -f name</code></span></p><p>如果需要查找到 pid 之后 kill 掉该进程,还可以使用 <code>pkill</code>:</p><p><span style="background-color: #c0c0c0"><code>pkill -f name</code></span></p><p>如果是可执行程序的话,可以直接使用 <code>pidof</code></p><p><span style="background-color: #c0c0c0"><code>pidof name</code></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 | + | <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>在已知进程名(<code>name</code>)的前提下,交互式 Shell 获取进程 pid 有很多种方法,典型的通过 grep 获取 pid 的方法为(这里添加 <code>-v grep</code>是为了避免匹配到 grep 进程):</p><p><span style="background-color: #c0c0c0"><code>ps -ef | grep "name" | grep -v grep | awk '{print $2}'</code></span></p><p><span style="background-color: #ffffff">或者不使用 <code>grep</code>(这里名称首字母加<code>[]</code>的目的是为了避免匹配到 awk 自身的进程):</span></p><p><span style="background-color: #c0c0c0"><code>ps -ef | awk '/[n]ame/{print $2}'</code></span></p><p>如果只使用 x 参数的话则 pid 应该位于第一位:</p><p><span style="background-color: #c0c0c0"><code>ps x | awk '/[n]ame/{print $1}'</code></span></p><p>最简单的方法是使用 <code>pgrep</code>:</p><p><span style="background-color: #c0c0c0"><code>pgrep -f name</code></span></p><p>如果需要查找到 pid 之后 kill 掉该进程,还可以使用 <code>pkill</code>:</p><p><span style="background-color: #c0c0c0"><code>pkill -f name</code></span></p><p>如果是可执行程序的话,可以直接使用 <code>pidof</code></p><p><span style="background-color: #c0c0c0"><code>pidof name</code></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 | 2 | ||
| 3 | 3 | ||
| 4 | 4 | ||
| - | 5</pre></td><td class="code"><pre>#! /bin/bash# process-monitor.shprocess=$1pid=$(ps x | grep $process | grep -v grep | awk '{print $1}')echo $pid</pre></td></tr></tbody></table><p>执行 <code>process-monitor.sh</code> 会出现多个结果:</p><pre>$> sh process-monitor.sh | + | 5</pre></td><td class="code" style="word-break: break-all;"><pre>#! /bin/bash |
| + | # process-monitor.sh | ||
| + | process=$1 | ||
| + | pid=$(ps x | grep $process | grep -v grep | awk '{print $1}') | ||
| + | echo $pid</pre></td></tr></tbody></table><p>执行 <code>process-monitor.sh</code> 会出现多个结果:</p><pre>$> sh process-monitor.sh | ||
| 3036  3098  3099</pre><p>进一步排查可以发现,多出来的几个进程实际上是子 Shell 的(临时)进程:</p><pre>root      3036  2905  0 09:03 pts/1    00:00:45 /usr/java/jdk1.7.0_71/bin/java ...name | 3036  3098  3099</pre><p>进一步排查可以发现,多出来的几个进程实际上是子 Shell 的(临时)进程:</p><pre>root      3036  2905  0 09:03 pts/1    00:00:45 /usr/java/jdk1.7.0_71/bin/java ...name | ||
| root      4522  2905  0 16:12 pts/1    00:00:00 sh process-monitor.sh name | root      4522  2905  0 16:12 pts/1    00:00:00 sh process-monitor.sh name | ||
| 行 10: | 行 14: | ||
| 3 | 3 | ||
| 4 | 4 | ||
| - | 5</pre></td><td class="code"><pre>#! /bin/bash# process-monitor.shprocess=$1pid=$(ps -ef | grep $process | grep '/bin/java' | grep -v grep | awk '{print $2}')echo $pid</pre></td></tr></tbody></table><hr/><h4>获取 Shell 脚本自身进程 pid</h4><p>这里涉及两个指令: 1. <code>$$</code> :当前 Shell 进程的 pid 2. <code>$!</code> :上一个后台进程的 pid 可以使用这两个指令来获取相应的进程 pid。例如,如果需要获取某个正在执行的进程的 pid(并写入指定的文件):</p><pre>myCommand && pid=$! | + | 5</pre></td><td class="code" style="word-break: break-all;"><pre>#! /bin/bash |
| - | myCommand & echo $! >/path/to/pid.file</pre><blockquote><p>注意,在脚本中执行 <code>$!</code> 只会显示子 Shell 的后台进程 pid,如果子 Shell 先前没有启动后台进程,则没有输出。</p></blockquote><hr/><h2>查看指定进程是否存在</h2><p>在获取到 pid 之后,还可以根据 pid 查看对应的进程是否存在(运行),这个方法也可以用于 kill 指定的进程。</p><pre>if ps -p $PID > /dev/nullthen   echo "$PID is running"   # Do something knowing the pid exists, i.e. the process with $PID is runningfi</pre><p><br/></p> | + | # process-monitor.sh |
| + | process=$1 | ||
| + | pid=$(ps -ef | grep $process | grep '/bin/java' | grep -v grep | awk '{print $2}') | ||
| + | echo $pid</pre></td></tr></tbody></table><hr/><h4>获取 Shell 脚本自身进程 pid</h4><p>这里涉及两个指令: 1. <code>$$</code> :当前 Shell 进程的 pid 2. <code>$!</code> :上一个后台进程的 pid 可以使用这两个指令来获取相应的进程 pid。例如,如果需要获取某个正在执行的进程的 pid(并写入指定的文件):</p><pre>myCommand && pid=$! | ||
| + | myCommand & echo $! >/path/to/pid.file</pre><blockquote><p>注意,在脚本中执行 <code>$!</code> 只会显示子 Shell 的后台进程 pid,如果子 Shell 先前没有启动后台进程,则没有输出。</p></blockquote><hr/><h2>查看指定进程是否存在</h2><p>在获取到 pid 之后,还可以根据 pid 查看对应的进程是否存在(运行),这个方法也可以用于 kill 指定的进程。</p><pre>if ps -p $PID > /dev/null  | ||
| + | then   echo "$PID is running"    | ||
| + | # Do something knowing the pid exists, i.e. the process with $PID is running | ||
| + | fi</pre><p><br/></p> | ||