如何获取鼠标在终端窗口中运行的shell的PID?

如何获取鼠标在终端窗口中运行的shell的PID?

虽然该论坛以前也曾问过类似的问题这里这里这里,我的问题不同。我想在 gnome 终端中获取正在运行的 bash 进程的 PID。

注意:版主发布的建议链接未提供任何可行的解决方案。我不明白为什么人们会无知地投票关闭我的主题。

类似命令

 xprop | awk '/PID/ {print $3}' | xargs ps h -o pid,cmd
 xprop _NET_WM_PID | cut -d' ' -f3

只给我gnome 终端父 PID 不是 bash 进程 ID

如果我跑

 PID=$$; echo $PID

或者

 cut -d ' ' -f 4 /proc/self/stat

给我终端的精确 PID,但我必须在终端中运行这些命令才能获取 PID。

我有一个脚本,可以使用快捷键组合在kill -STOP PID和之间切换终端进程。kill -CONT PID

    #!/bin/bash
    myid=$(ps $(xdotool getwindowfocus getwindowpid) |tail -n 1 |awk '{print $3}')
    if [[ $myid == "Sl" ]]
    then
    kill -STOP `xdotool getwindowfocus getwindowpid`
    else
    kill -CONT `xdotool getwindowfocus getwindowpid`
    fi

正如我提到的那样 myid=$(ps $(xdotool getwindowfocus getwindowpid) |tail -n 1 |awk '{print $3}')

仅返回父级的 PIDgnome 终端

有没有什么办法可以实现我的愿望?

编辑:除了 Dmitry Alexandrov 的答案之外,我还在这里找到了另一个可行的解决方案如何知道活动窗口的 pid

编辑 2:我说得太早了。我不知道为什么,但上面的解决方案并不可靠。所以我使用了 Dmitry Alexandrov 的解决方案,除了我的脚本中的一个小故障外,它运行良好。

   #!/bin/bash
   read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
   SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
   mypid=$(echo $SH_PID | awk  ' { print $2 } ' )
   myid=$(ps $mypid |tail -n 1 |awk '{print $3}')
   if [[ $myid == "Sl" ]]
   then
   kill -STOP $mypid
   else
   kill -CONT $mypid
   fi
Note: Process STAT is not reliable, it doesn't always toggle between Sl and T, it sometimes takes different states such as `Ss+` `S<` 

编辑3:

这个很好用

   #!/bin/bash
   read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
   SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
   mypid=$(echo $SH_PID | awk  ' { print $2 } ' )
   myid=$(ps $mypid |tail -n 1 |awk '{print $3}')
   if [[ *$myid* == *"S"* ]]
   then
   kill -STOP $mypid
   else
   kill -CONT $mypid
   fi

答案1

如果终端只有一个 shell 进程,我就看不出有什么问题。

read __ __ TERM_PID < <(xprop _NET_WM_PID) &&\
SH_PID=$(ps --ppid "$TERM_PID" -o pid=)
kill -STOP "$SH_PID"

适用于 XTerm,我相信也应该适用于 GNOME 终端。

否则 - 如果在单个终端进程下可能有多个 shell 运行(在多个窗口、选项卡、区域、通过多路复用器等),那么从问题中就不清楚你想要什么。

相关内容