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 2
,cut
是一个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)之一,用于格式化文本,非常强大(实际上它是一门编程语言,支持条件判断,数组,循环等等)。
觉得文章对你有用的话鼓励一下我吧