在 shell 脚本内后台执行时 QEMU 不会启动

在 shell 脚本内后台执行时 QEMU 不会启动

我有一个应用程序运行良好,当直接从终端运行时,带或不带“&”。但是,如果我尝试从 shell 脚本执行它,则仅当跳过尾随“&”时它才有效。因此,我无法从 shell 脚本内部在后台启动此进程。

<Path to My application> <options> &

应用程序窗口打开,但此后没有任何进展。

(该应用程序是(由我)修改的 qemu 0.13.0 版本。当我在 shell 脚本中从后台运行磁盘映像时,我遇到了黑屏问题)

答案1

当应用程序具有执行此操作的内置选项时,无需使用 & 符号将应用程序设置为后台。 qemu 就是这种情况(除非您将其删除):

% qemu-kvm --help | grep daemon
-daemonize      daemonize QEMU after initializing

答案2

您是否看到类似这样的消息

[1] suspended (tty output) myapplication

在终端?此消息意味着您的程序正在尝试从终端读取(可能是因为它正在从标准输入读取)。由于只有前台程序可以从终端读取数据,因此该程序被挂起。

如果您看到此消息,请找出您的程序正在读取的原因。无奈之下,尝试重定向其标准输入 ( myapplication </dev/null)。

如果您没有看到这样的消息,则表明您的程序中存在其他错误。查看您的程序在调试器中或使用strace.

答案3

从终端运行后台命令和从 shell 脚本运行后台命令之间存在差异。

在非交互式 shell(禁用作业控制)中,后台命令的 stdin 会从 隐式重定向/dev/null,这可能会导致您的命令根本不执行。

请参阅 POSIX 标准Shell 命令语言:异步列表

# compare where fd 0 is pointing to
sh -c 'sleep 10 & lsof -p ${!}'
sh -c 'sleep 10 0<&0 & lsof -p ${!}'
sh -c 'set -m; sleep 10 & lsof -p ${!}'
sh -ic 'sleep 10 & lsof -p ${!}'

相关内容