我当前的脚本如下所示:
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
命令,因为我希望使用默认的编辑器/查看器运行文件。
答案 0 :(得分:2)
wineserver
有一个--wait
标记,可以用来做到这一点。
但是,如果您一次运行多个程序,它将等待所有程序完成。
答案 1 :(得分:2)
wine <program>
等待程序退出。 wine start program
不会。
摘要:
wine <program>
等到程序完成。我建议使用这种方法。wine start <program>
退出,无需等待。wine start \wait
也要等到程序完成。wineserver --wait
等到Wine中的所有程序 和所有服务完成。上一个程序完成后,诸如services.exe
,plugplay.exe
和winedevice.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"