等待Wine运行完成

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个回答

3

要等待由wine启动的进程退出,您可以将其输出导入到另一个程序中。在我的系统上,以下操作可以实现期望的效果:

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

如果您想进行异步等待:

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

注意:该命令中的 | cat 部分不起作用。当 wine 命令退出时,cat 就会结束。然而,**wine 本身会等待程序退出**。wine start(OP 正在使用的)不会等待。因此,解决方案就是使用 wine 而不是 wine start - Merlijn Sebrechts
1
@MerlijnSebrechts 管道(|cat部分)会改变缓冲和isatty()的结果,因此可能会影响Wine。在撰写本文时,需要使用管道来使Wine表现符合预期。但是,Wine可能已经发生了变化,不再需要使用管道。 - coldfix
谢谢您的解释!从我的非科学测试来看,使用“| cat”命令并没有使Wine命令等待更长时间。但我发现了这个评论,它说有些程序可能需要这样做以防止它们表现不当:https://dev59.com/dXM_5IYBdhLWcg3wZSE6#lvTqnYgBc1ULPQZFVxV4 - Merlijn Sebrechts

3

wineserver有一个--wait标志,可以用来实现这一点。

然而,如果您同时运行多个程序,则它将等待所有程序完成。


3

wine <program> 启动程序并等待程序退出。我建议使用这种方法。

wine start <program> 启动程序,立即退出而不等待。程序将在后台继续运行。

wine start \wait <program> 启动程序并等待程序退出。这与wine <program>的行为相同。

wineserver --wait 等待Wine中的所有程序和服务完成。此命令本身不启动任何程序,而是等待现有的程序和服务。

services.exeplugplay.exewinedevice.exe这样的服务会在最后一个程序完成几秒钟后继续运行,wineserver --wait还会等待直到这些服务退出。

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


你从哪里找到这个摘要的?从命令行中没有这样的描述,我也在互联网上找不到它,你是从哪里得到的? - Mario Palumbo
1
@MarioPalumbo 我自己创建了这个摘要,实际上它并不存在。互联网上的许多信息相互矛盾,因此我进行了自己的测试。我需要知道这种区别,以便开发sommelier-core:https://github.com/snapcrafters/sommelier-core - Merlijn Sebrechts

0

发生的情况是,wine只是请求wineserver启动程序并退出,而我没有找到任何好的机制来从wineserver获取有关它生成的进程的通知。

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

如果没有更好的解决方案出现,您可能希望建议将此功能添加到Wine开发人员中(可能作为wine的标志)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接