我有一个应用程序运行良好,当直接从终端运行时,带或不带“&”。但是,如果我尝试从 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 ${!}'