3

我当前的脚本如下所示:

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

4 回答 4

3

要等待由 wine 启动的进程退出,您可以将其输出通过管道传输到另一个程序。在我的系统上,以下实现了预期的效果:

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

如果要异步等待:

wine "program.exe" | cat & pid=$!
# ...
wait $pid
echo "program.exe has finished"
于 2012-08-07T10:50:31.977 回答
3

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

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

于 2012-08-07T14:01:36.403 回答
3

wine <program>等到程序退出。wine start program才不是。

总结:

  • wine <program>等到程序结束。我推荐使用这种方法。
  • wine start <program>无需等待即可退出。
  • wine start \wait <program>也等到程序完成。
  • wineserver --wait等到Wine 中的所有程序 和所有服务完成。此命令本身不会启动任何程序,而是等待现有的程序和服务。

services.exeplugplay.exe和等服务winedevice.exe在最后一个程序完成后继续运行几秒钟,并wineserver --wait一直等到这些服务退出。

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

于 2020-04-05T21:01:48.053 回答
0

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

我的建议是等待通过使用如何等待非子进程退出中wineserver的方法之一启动的进程完成,但您需要知道它的 PID。可能的想法:运行并从那里获取 PID,但我看不出有简单的方法来找出哪个是哪个,以避免竞争条件,并忽略噪音;或尝试在 的输出中找到您的过程,但它很难看,而且绝对不健壮。wineserver -f -d | grep init_thread(ps

如果没有更好的表面,您可能想建议向 Wine 开发人员添加这样的功能(可能作为 的标志wine)。

于 2011-08-26T17:08:48.820 回答