Shell脚本获取进程pid的方法

Shell脚本获取进程pid的方法

先上最终命令,比如要获取redis进程的id:

ps aux | grep redis | grep -v "grep" | tr -s ' ' | cut -d ' ' -f 2

分解执行如下:

root > ps aux | grep redis
root              7836   0.0  0.0  4277272    828 s002  S+    2:47下午   0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn redis
root                64   0.0  0.0  4347276    544   ??  Ss   日08下午   3:28.13 /usr/local/opt/redis/bin/redis-server 127.0.0.1:6378
root > 
root >  ps aux | grep redis | grep -v "grep"
root                64   0.0  0.0  4347276    544   ??  Ss   日08下午   3:28.14 /usr/local/opt/redis/bin/redis-server 127.0.0.1:6378
root > 
root > ps aux | grep redis | grep -v "grep" | tr -s ' '
root 64 0.0 0.0 4347276 544 ?? Ss 日08下午 3:28.15 /usr/local/opt/redis/bin/redis-server 127.0.0.1:6378
root > 
root > ps aux | grep redis | grep -v "grep" | tr -s ' ' | cut -d ' ' -f 2
64
root > 

grep -v "grep"-v表示--invert-match,也就是反匹配,整句的意思就是不显示带有“grep”字符串的行,因为经常会出现类似以下这样的行,这并不是真正的所以要排除掉:

color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn redis

tr -s ' 'tr是“translate”,转换,-s是“string”的缩写,后面跟着的就是一个字符串,只不过这里指定的字符串为“空格”而已,意思是“压缩给定字符串中连续出现的某个字符串为1个”,这里的“某个”是哪个呢?就是由-s后面指定的那个字符串,比如本例-s后面指定的是“空格”(所以要注意,两个单引号之间是有一个空格的),那么该命令遇到连续多个的空格就会把它压成一个空格,压缩后效果:

root 64 0.0 0.0 4347276 544 ?? Ss 日08下午 3:28.15 /usr/local/opt/redis/bin/redis-server 127.0.0.1:6378

注:其实如果用awk来做这个功能,根本就不用这么麻烦。


cut -d ' ' -f 2cut是一个linux命令,就是它的英文意思“剪切”,-d是“delimiter”的缩写,定界符,分隔符,意思是按哪个字符串来分隔剪切,很明显我们这里得用“空格”作为分隔符来剪切(所以要注意两个单引号之间是有一个空格的),这样一个字符串就被剪成很多列了,而-f是“field”的意思,即“字段”、“列”,所以-f 2意思就是取cut剪切后的第二列,因为pid是在第二列,所以我们这样就能取到pid。

方法二:使用awk

ps aux | grep -v "grep" | grep redis | awk '{print $2}'

awk '{print $2}'表示打印第二列,$0为原始字符串,$n(n>0)为第n列。awk为Linux三剑客(grep/sed/awk)之一,用于格式化文本,非常强大(实际上它是一门编程语言,支持条件判断,数组,循环等等)。

打赏

订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

Shell脚本获取进程pid的方法