【问题标题】:I run a program in a shell script. How do i know if it has loaded? (Linux)我在 shell 脚本中运行一个程序。我怎么知道它是否已加载? (Linux)
【发布时间】:2017-04-09 21:41:53
【问题描述】:

我编写了一个运行 python 程序的 shell 脚本。然后我想使用 xdotool 将文件加载到程序中。现在这是我的代码:

#!/bin/bash
cd ~/Folder
python program.py &
sleep 10
WID=$(xdotool search --onlyvisible program)
....

我真的不喜欢只等待 10 秒以加载程序的解决方案。有没有更好的办法?

【问题讨论】:

  • 您的 Python 程序是否已启动脚本的第二部分?
  • python 程序不是我写的。它是一个开源软件
  • xdotool search 有一个 --sync 选项,它将等待窗口变得可见。如果您使用该选项(即xdotool search --sync --onlyvisible program)运行它,那么您的脚本根本不需要sleep
  • @ottomeister 谢谢!!这就是我的问题的解决方案。即使没有睡眠,它还能 100% 工作吗?我的意思是有时窗口是可见的,但还没有准备好?
  • 这取决于程序的编写方式。通常,当一个窗口变得可见时,程序已经安排好接受和处理发送到窗口中的事件,所以你应该是安全的,没有睡眠。如果您想格外小心,您可以在xdotool search 返回后睡一两秒钟。这仍然比原来的 10 秒睡眠要好。

标签: python linux shell xdotool


【解决方案1】:

这真的取决于。如果program.py 应该完成然后继续xdotool 那么您可能想要使用&& 而不是&。单个& 表示您希望命令执行,然后尽快转到下一个命令,而无需等待它完成。 dobule && 表示您要等待执行完成,然后仅在您有零错误退出时才继续。如果您想运行下一个命令而不管program.py 是否成功,您也可以删除& 或使用;。这就是我的意思:

#!/bin/bash
cd ~/Folder
python program.py &&
WID=$(xdotool search --onlyvisible program)
...

如果program.py 应该在您运行xdotool 命令时继续运行,但您需要program.py 在继续之前进入某种就绪状态,那么您使用& 是正确的,但您需要以某种方式监视program.py,并从中获取可以继续的信号。一种古老的方法是让program.py 创建/触摸/编辑一个文件,当检测到该文件时,您继续。更高级的方法是使用网络套接字或类似方法,但如果您真的不需要做任何花哨的事情,我建议您不要这样做。无论如何,如果你让program.py 创建一个信号文件,比如/tmp/.program_signalfile,当一切准备就绪时,你所要做的就是:

#!/bin/bash
cd ~/Folder
python program.py &
until [ -f /tmp/.program_signal_file ]
do
    sleep 1
done
WID=$(xdotool search --onlyvisible program)
rm /tmp/.program_signal_file
...

在最后一个解决方案中,program.pyxdotool 都同时运行。如果这就是你要找的东西。

【讨论】:

  • 谢谢你说的真的很有用。我需要在运行 xdotool 命令时运行程序。但是我如何让程序创建一个文件?这是一个开源软件,不是我写的。
  • 在源代码中有一行叫做 app.MainLoop() 我要在那之前创建文件吗?但是我如何创建一个文件?抱歉,我对此还是很陌生
猜你喜欢
  • 1970-01-01
  • 2010-09-20
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2011-04-03
相关资源
最近更新 更多