跳至内容
技术分享
站点工具
工具
显示页面
修订记录
反向链接
最近更改
媒体管理器
网站地图
登录
>
最近更改
媒体管理器
网站地图
登录
搜索
您的足迹:
服务器技术:sheel:bash_shell_获取进程_pid
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
<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 2 3 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 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 4523 4522 0 16:12 pts/1 00:00:00 sh process-monitor.sh 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"><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=$! 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>
服务器技术/sheel/bash_shell_获取进程_pid.1528333305.txt.gz
· 最后更改: 2018/09/10 18:01 (外部编辑)
页面工具
显示页面
修订记录
反向链接
页面重命名
回到顶部