gpt4 book ai didi

linux - 脚本中奇怪的 grep 行为

转载 作者:太空宇宙 更新时间:2023-11-04 10:12:19 25 4
gpt4 key购买 nike

在我的一个工具中需要系统中特定进程的 PID。我尝试通过以下命令执行此操作:

parasit@host:~/# ps -ef | grep beam.smp |grep -v grep |awk '{ print $2 }' |head -n1
11982

工作正常,但是当我尝试在脚本中使用相同的命令时,在绝大多数情况下,尽管有 'grep - v grep`。

parasit@host:~/# cat getPid.sh
#!/bin/bash

PROC=$1
#GET PID
CMD="ps -ef | grep $PROC |grep -v grep |awk '{ print \$2 }' |head -n1"
P=`eval $CMD`


parasit@host:~/# bash -x ./getPid.sh beam.smp
+ PROC=beam.smp
+ CMD='ps -ef |grep beam.smp |grep -v grep |awk '\''{ print $2 }'\'' |head -n1'
++ eval ps -ef '|grep' beam.smp '|grep' -v grep '|awk' ''\''{' print '$2' '}'\''' '|head' -n1
+++ head -n1
+++ awk '{ print $2 }'
+++ grep -v grep
+++ grep beam.smp
+++ ps -ef
+ P=2189

有趣的是,它不是确定性的,我知道这听起来很奇怪,但有时它工作正常,有时不工作,我不知道它取决于什么。

这怎么可能?有没有更好的方法从结果中删除“grep”?

BR寄生

最佳答案

pidof -s 是为此而设计的(-s:返回单个 ID):

pidof -s "beam.smp"

但是,pidof 也会返回失效(僵尸、死)进程。所以这是获取指定命令的第一个事件和运行进程的 PID 的方法:

# function in bash

function _get_first_pid() {
ps -o pid=,comm= -C "$1" | \
sed -n '/'"$1"' *$/{s:^ *\([0-9]*\).*$:\1:;p;q}'
}

# example

_get_first_pid "beam.smp"

  1. -o pid=,comm=:仅列出 PID 和 COMMAND 列; IE。只列出我们需要检查的内容;如果都列出来,那么以后处理起来就比较困难了
  2. -C "$1":-C中指定的命令; IE。只找到那个特定命令的过程,而不是所有的
  3. sed:只为没有“defunct”或基本命令名称后任何内容的第一行打印 PID

关于linux - 脚本中奇怪的 grep 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48303794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com