ænd*_*rük 5 scripts gnome-terminal automation
如何从 Bash 脚本中获取我正在使用的 GNOME 终端实例的 PID?
我可以运行xprop _NET_WM_PID然后手动单击终端窗口,但我想完全自动化。
我编写了两个递归函数来跟踪进程的父进程
get_parent()
{
ps --no-headers -p $1 -o ppid,cmd
}
process_list()
{
if [ "$1" -ne "1" ]; then
PARENT="$(get_parent $1 )"
printf "%s\n" "$PARENT"
process_list $( printf "%s" "$PARENT" | awk '{print $1}' )
fi
}
print_header()
{
printf "PPID\tPROCESS\n"
for i in $(seq 1 20 )
do
printf "-"
done
printf "\n"
}
print_header
process_list $$
Run Code Online (Sandbox Code Playgroud)
我在这个过程中发现的是这样的:
$ bash get_process_list
PPID PROCESS
--------------------
31264 bash get_process_list
31251 mksh
16696 gnome-terminal
15565 /bin/mksh
2164 x-terminal-emulator
1677 init --user
1342 lightdm --session-child 12 19
1 lightdm
Run Code Online (Sandbox Code Playgroud)
因此,我们可以使用这两个函数和grep,gnome-terminal假设这就是用户想要的。如果用户想要任何终端模拟器,这可能会出现问题,因为除了检查lsofpts 设备是否打开之外,无法判断该进程是否是终端模拟器。
除此之外,还有一点非常有趣:
$ bash get_process_list
PPID PROCESS
--------------------
32360 bash get_process_list
23728 -mksh
2164 tmux
1677 init --user
1342 lightdm --session-child 12 19
1 lightdm
Run Code Online (Sandbox Code Playgroud)
tmux显然fork 本身并且该过程被 接管,init所以又出现了障碍。
下面的代码使用qdbusAyatana 的 dbus 接口来列出所有 gnome 终端窗口以及它们当前是否处于焦点状态。稍后可以对其进行解析或编辑以仅输出活动/聚焦窗口 PID
示例运行:
$ bash get_gt_pd.sh
XID:33554486 PID:20163 ACTIVE:true
XID:33554444 PID:20163 ACTIVE:false
Run Code Online (Sandbox Code Playgroud)
以及代码本身
get_parent()
{
ps --no-headers -p $1 -o ppid,cmd
}
process_list()
{
if [ "$1" -ne "1" ]; then
PARENT="$(get_parent $1 )"
printf "%s\n" "$PARENT"
process_list $( printf "%s" "$PARENT" | awk '{print $1}' )
fi
}
print_header()
{
printf "PPID\tPROCESS\n"
for i in $(seq 1 20 )
do
printf "-"
done
printf "\n"
}
print_header
process_list $$
Run Code Online (Sandbox Code Playgroud)