虽然该论坛以前也曾问过类似的问题这里,这里 和这里,我的问题不同。我想在 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 运行(在多个窗口、选项卡、区域、通过多路复用器等),那么从问题中就不清楚你想要什么。