站点工具


服务器技术:sheel:bash_shell_获取进程_pid

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
服务器技术:sheel:bash_shell_获取进程_pid [2018/06/07 09:31]
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 的方法为(这里添加&​nbsp;<​code>​-v grep</​code>​是为了避免匹配到 grep 进程):</​p><​p><​span style="​background-color:​ #​c0c0c0"><​code>​ps -ef | grep &​quot;​name&​quot;​ | grep -v grep | awk &#​39;​{print $2}&#​39;</​code></​span></​p><​p><​span style="​background-color:​ #​ffffff">​或者不使用&​nbsp;<​code>​grep</​code>​(这里名称首字母加<​code>​[]</​code>​的目的是为了避免匹配到 awk 自身的进程):</​span></​p><​p><​span style="​background-color:​ #​c0c0c0"><​code>​ps -ef | awk &#​39;/​[n]ame/​{print $2}&#​39;</​code></​span></​p><​p>​如果只使用 x 参数的话则 pid 应该位于第一位:</​p><​p><​span style="​background-color:​ #​c0c0c0"><​code>​ps x | awk &#​39;/​[n]ame/​{print $1}&#​39;</​code></​span></​p><​p>​最简单的方法是使用&​nbsp;<​code>​pgrep</​code>​:</​p><​p><​span style="​background-color:​ #​c0c0c0"><​code>​pgrep -f name</​code></​span></​p><​p>​如果需要查找到 pid 之后 kill 掉该进程,还可以使用&​nbsp;<​code>​pkill</​code>​:</​p><​p><​span style="​background-color:​ #​c0c0c0"><​code>​pkill -f name</​code></​span></​p><​p>​如果是可执行程序的话,可以直接使用&​nbsp;<​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 的方法为(这里添加&​nbsp;<​code>​-v grep</​code>​是为了避免匹配到 grep 进程):</​p><​p><​span style="​background-color:​ #​c0c0c0"><​code>​ps -ef | grep &​quot;​name&​quot;​ | grep -v grep | awk &#​39;​{print $2}&#​39;</​code></​span></​p><​p><​span style="​background-color:​ #​ffffff">​或者不使用&​nbsp;<​code>​grep</​code>​(这里名称首字母加<​code>​[]</​code>​的目的是为了避免匹配到 awk 自身的进程):</​span></​p><​p><​span style="​background-color:​ #​c0c0c0"><​code>​ps -ef | awk &#​39;/​[n]ame/​{print $2}&#​39;</​code></​span></​p><​p>​如果只使用 x 参数的话则 pid 应该位于第一位:</​p><​p><​span style="​background-color:​ #​c0c0c0"><​code>​ps x | awk &#​39;/​[n]ame/​{print $1}&#​39;</​code></​span></​p><​p>​最简单的方法是使用&​nbsp;<​code>​pgrep</​code>​:</​p><​p><​span style="​background-color:​ #​c0c0c0"><​code>​pgrep -f name</​code></​span></​p><​p>​如果需要查找到 pid 之后 kill 掉该进程,还可以使用&​nbsp;<​code>​pkill</​code>​:</​p><​p><​span style="​background-color:​ #​c0c0c0"><​code>​pkill -f name</​code></​span></​p><​p>​如果是可执行程序的话,可以直接使用&​nbsp;<​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"​ style="​word-break:​ break-all;"><​pre>#​!&​nbsp;/​bin/​bash 5</​pre></​td><​td class="​code"​ style="​word-break:​ break-all;"><​pre>#​!&​nbsp;/​bin/​bash
-#&​nbsp;​process-monitor.shprocess=$1+#&​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;​) 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;<​code>​process-monitor.sh</​code>&​nbsp;​会出现多个结果:</​p><​pre>​$&​gt;&​nbsp;​sh&​nbsp;​process-monitor.sh echo&​nbsp;​$pid</​pre></​td></​tr></​tbody></​table><​p>​执行&​nbsp;<​code>​process-monitor.sh</​code>&​nbsp;​会出现多个结果:</​p><​pre>​$&​gt;&​nbsp;​sh&​nbsp;​process-monitor.sh
行 14: 行 15:
 4 4
 5</​pre></​td><​td class="​code"​ style="​word-break:​ break-all;"><​pre>#​!&​nbsp;/​bin/​bash 5</​pre></​td><​td class="​code"​ style="​word-break:​ break-all;"><​pre>#​!&​nbsp;/​bin/​bash
-#&​nbsp;​process-monitor.shprocess=$1+#&​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;​) 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;<​code>​$$</​code>&​nbsp;​:当前 Shell 进程的 pid 2.&​nbsp;<​code>​$!</​code>&​nbsp;​:上一个后台进程的 pid 可以使用这两个指令来获取相应的进程 pid。例如,如果需要获取某个正在执行的进程的 pid(并写入指定的文件):</​p><​pre>​myCommand&​nbsp;&​amp;&​amp;&​nbsp;​pid=$! echo&​nbsp;​$pid</​pre></​td></​tr></​tbody></​table><​hr/><​h4>​获取 Shell 脚本自身进程 pid</​h4><​p>​这里涉及两个指令: 1.&​nbsp;<​code>​$$</​code>&​nbsp;​:当前 Shell 进程的 pid 2.&​nbsp;<​code>​$!</​code>&​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;<​code>​$!</​code>&​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;​ +myCommand&​nbsp;&​amp;&​nbsp;​echo&​nbsp;​$!&​nbsp;&​gt;/​path/​to/​pid.file</​pre><​blockquote><​p>​注意,在脚本中执行&​nbsp;<​code>​$!</​code>&​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;​ 
-#&​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;​runningfi</​pre><​p><​br/></​p>​+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>​
服务器技术/sheel/bash_shell_获取进程_pid.1528335098.txt.gz · 最后更改: 2018/09/10 18:01 (外部编辑)