后台进程发出窗口信息有一些延迟,如何管理它?

后台进程发出窗口信息有一些延迟,如何管理它?

如果我运行这些命令:

...
geany --new-instance --no-msgwin --no-session --no-terminal -c pathtoconfig/ &
pid=$!
echo $pid
wmctrl -lp
read -p "waiting..."
...

生成的 PID 与启动的进程的 PID 不匹配geany。但如果sleep 1在读取 PID 之前(该geany行之后)插入命令,则 PID 是正确的。其原因是窗口化需要一些时间,因此wmctrl -lp提供的初步信息并不能准确地提供正确的 PID。在新窗口稳定并wmctrl意识到这一点之前等待 geany 完成启动的最佳方法是什么?

更新: - 在 Lubuntu 16.04 / HP ProBook 6360b 上运行。

  • wmctrl -lp与列表中包含 PID 的实际 PID 进行比较。

  • PID 是由 正确获取的$!,需要一些时间更新的是由 提供的wmctrl -lp,在一段时间后会有所不同(一些 0.27 秒geany,一些 0.16 秒leafpad),就好像窗口管理器需要一些时间来更新 PID 一样。

答案1

xdotool search --sync --pid "$PID"会准确地做你想做的事。我找到了这个方法这里

- 同步- 阻塞直到有结果。当您启动应用程序并希望等到应用程序窗口可见时,这非常有用。

模板:

#!/bin/bash

geany &
PID=$!

if xdotool search --sync --pid "$PID" > /dev/null; then
     # if window with the specific PID has appeared
     # then doing something here
fi

笔记:

不适用于某些应用程序,Netbeans例如,因为:

--pid PID- 匹配属于特定进程 ID 的窗口。这对于某些未在其窗口上设置此元数据的 X 应用程序可能不起作用。

如果更改--pid "$PID"--name netbeans--class netbeans它也有效。

工作示例:

该脚本计算启动geany &和 geany 窗口出现之间的延迟(以毫秒为单位)。

#!/bin/bash

geany &
PID=$!
time_start=$(date '+%s%3N')
if xdotool search --sync --pid "$PID" > /dev/null; then
    time_end=$(date '+%s%3N')
    time_interval=$((time_end - time_start))
    printf "%'d ms\n" "$time_interval"
fi

输出:

$ ./delay_calculate.sh 
553 ms

相关内容