等待葡萄酒完成运行

时间:2011-08-26 14:04:42

标签: bash wine

我当前的脚本如下所示:

cd ~/.wine/drive_c/
echo "test123" > foo$$.txt
wine start "C:\foo$$.txt"
wineserver -w
echo "Wine is done!"

当一次只有一个程序在wine中运行时,它可以正常工作。但是,如果我第二次运行它,在第一个程序完成之前,两个脚本都会等待其他程序退出。

这不起作用:

cd ~/.wine/drive_c/
echo "test123" > foo$$.txt
$(wine start "C:\foo$$.txt") &
wait ${!}
echo "Wine is done!"

因为它会在您关闭文本编辑器之前退出。

我需要使用start命令,因为我希望使用默认的编辑器/查看器运行文件。

4 个答案:

答案 0 :(得分:2)

wineserver有一个--wait标记,可以用来做到这一点。

但是,如果您一次运行多个程序,它将等待所有程序完成。

答案 1 :(得分:2)

wine <program>等待程序退出。 wine start program不会。

摘要:

  • wine <program>等到程序完成。我建议使用这种方法。
  • wine start <program>退出,无需等待。
  • wine start \wait也要等到程序完成。
  • wineserver --wait等到Wine中的所有程序 和所有服务完成。

上一个程序完成后,诸如services.exeplugplay.exewinedevice.exe之类的服务会继续运行几秒钟,并且wineserver --wait也要等到这些服务退出为止。

其中一些服务保留状态,并在退出时将其状态(和注册表)写入磁盘。因此,如果您要备份或删除您的wine前缀,请确保等到这些服务退出为止。

答案 2 :(得分:0)

wine只是要求wineserver启动程序并退出,我发现没有好的机制可以从wineserver获取有关它产生的进程的通知。< / p>

我的建议是等待wineserver使用How to wait for exit of non-children processes中的一种方法完成由wineserver -f -d | grep init_thread(启动的过程,但您需要知道它的PID。可能的想法:运行ps并从那里获得PID,但我看不出有什么简单的方法可以找出哪个,避免竞争条件,并忽略噪音;或尝试在wine的输出中找到您的流程,但它很难看,而且绝对不健壮。

如果没有更好的表面,你可能想建议添加这样一个功能给Wine开发者(可能作为{{1}}的标志)。

答案 3 :(得分:0)

要等待wine启动的进程退出,您可以将其输出传递给另一个程序。 在我的系统上,以下功能达到了预期的效果:

wine "program.exe" | cat
echo "program.exe has finished"

如果您想要异步等待:

wine "program.exe" | cat & pid=$!
# ...
wait $pid
echo "program.exe has finished"