虽然之前在这个论坛这里、这里 和这里提出过类似的问题,但我的问题是不同的。我想在 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}')
只返回父级 gnome 终端的 PID
有没有办法实现我想要的?`
编辑:除了 Dmitry Alexandrov 的回答,我还在这里找到了另一个有效的解决方案How to know the pid of active window
EDIT2:我说得太早了。我不知道为什么,但上面的解决方案不能可靠地工作。所以我正在使用 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
如果终端只有一个 shell 进程,我看不出有什么问题。
适用于 XTerm,我相信也应该适用于 GNOME 终端。
否则——如果可能有多个 shell 在单个终端进程下运行(在多个窗口、选项卡、区域中,通过多路复用器等),从问题中不清楚,你想要什么。