如果我运行这些命令:
...
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