我有一个(非常简单的)Windows 控制台应用程序,我想使用 Wine 在 Linux 服务器上运行它。当我通过 SSH 从终端运行它时,就像
wine myapp.exe
一切都运行良好。它运行良好,做了所有该做的事情,而且 CPU 使用率相当低(大约 5%)。
当我尝试在后台运行它时,问题就开始出现了。即使是像
nohup wine myapp.exe
导致 CPU 使用率飙升至 100%(一个完整核心)。将输出重定向到 /dev/null 等无济于事。
我尝试使用 upstart 并采用以下设置来运行它:
start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec sudo -H -u myuser wine /path/to/my/app.exe &> /dev/null
CPU 使用率为 100%。我尝试了其他几个选项,直到我发现以下版本(使用 wineconsole 代替 wine 并在 sudo 中添加“-b”开关)运行良好(CPU 使用率为 5-7%):
exec sudo -b -H -u myuser wineconsole /path/to/my/app.exe
问题是,如果我这样运行它,upstart 不会跟踪 pid,因此 respawn 等不起作用。当我将“expect-fork”添加到配置中时,CPU 使用率再次上升到 100%。当我将重定向添加到 /dev/null 时,CPU 使用率上升到 100%。基本上我做的任何事情都会导致 CPU 使用率上升到 100%。
您知道是什么原因造成这种影响吗?
答案1
终于找到了问题的根源和解决方案(尽管该解决方案肯定不是完美的)。
问题实际上是由输入重定向引起的。当键盘输入被 /dev/null 替换时,wine 或程序中的某些东西(我没有调查)似乎进入了快速运行的无限循环,从而导致高 CPU 负载。
我发现的解决方案是将“控制台所有者”添加到 Upstart 配置中,以便将进程连接到控制台。之后我甚至能够正确重定向输出 :)
由于该程序在数据中心的专用服务器上运行,因此这种设置似乎不会造成任何麻烦。
答案2
我也遇到了同样的问题。我的解决方案:首先启动 Xvfb 屏幕,然后导出 DISPLAY=:1.0 && wineconsole 命令