【问题标题】:get the pid of specified process name from pstree by using shell script使用shell脚本从pstree获取指定进程名的pid
【发布时间】:2015-04-29 03:18:44
【问题描述】:

我正在使用pstree来获取一组进程,结果会是这样的

进程A(123)---进程B(124)---进程C(125)---进程目标(126)---进程D(127)

我想使用关键字“processTarget”来获取pid,即126。

之所以选择pstree,是因为我会向这组进程发送SIGTSTP信号和SIGCONT信号。

我怎么能这样做?有什么简单的方法吗?

注意:processTarget(126) 不在固定位置,因此无法使用 awk 获取 PID。

【问题讨论】:

  • 不要使用pstree使用pgrep
  • @EtanReisner 我选择pstree的原因是我会发送SIGTSTP信号和SIGCONT给这组进程。
  • 我很困惑。您问如何从该输出(即126)中获取特定进程的pid,这不是pgrep 所做的吗?其余的过程与什么有什么关系?如果您还需要他们的 pid,为什么这不是您问题的一部分?
  • @EtanReisner 感谢您的回答。 pgrep 是我的新员工。我只是从你那里知道的。解决问题对我来说更有用。非常感谢。

标签: linux bash shell pstree


【解决方案1】:

参数扩展/子字符串提取非常简单。示例:

#!/bin/bash

##plist=$( pstree something )  # actual command to fill plist

plist="processA(123)---processB(124)---processC(125)---processTarget(126)---processD(127)"

temp="${plist##*processTarget(}"
ptgtnum="${temp%%)--*}"

printf "\n  processTarget = %s\n\n" "$ptgtnum"

exit 0

输出

$ bash ptgt.sh

  processTarget = 126

【讨论】:

    【解决方案2】:

    您可以使用grep

    <pstree command> | grep -P -o 'processTarget\([0-9]+\)'

    -P 表示使用 Perl 正则表达式 -o 表示只返回匹配项

    man grep了解更多详情

    如果目标只是获取 id,您可以继续这种方法以仅返回整数

    <pstree command> | grep -P -o 'processTarget\([0-9]+\)' | grep -P -o '[0-9]+'

    【讨论】:

    • 是的,我从来不知道。似乎很适合这个。不知道我是否应该留下这个答案。
    • @dan08 它仍然对我有很大帮助。谢谢。
    【解决方案3】:

    你可以考虑sed

    echo 'processA(123)---processB(124)---processC(125)---processTarget(126)---processD(127)' \ | sed 's/.*processTarget(\([0-9]*\)).*/\1/'
    126
    

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 2022-01-05
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      相关资源
      最近更新 更多