有什么方法可以让安装程序会话保持活动状态直到完成?
是的,您可以等待 oracle 静默安装在 Linux 上完成,例如在 shell 脚本中,如下所示。
(下面是用于 Redhat Enterprise Linux 的 oracle 11g 第 2 版。)
您可以通过执行以下操作等待它完成:
$ /directory_path/runInstaller -silent -responseFile responsefilename |
while read l ;
do
echo "$l" ;
done
(这依赖于这样一个事实,即使 java 通用安装程序在后台运行,它仍然使用标准输出,所以“读取 l”一直成功,直到后台通用安装程序进程退出)
并在屏幕上显示某种进展?
有点棘手,但我们可以通过在它退出之前从 runInstaller 的输出中找出日志文件的名称来做到这一点。输出包含如下一行:
Preparing to launch Oracle Universal Installer from /tmp/xxxxOraInstallTTT. ...
... 其中 TTT 是一个时间戳,它引导我们找到正确的日志文件 /opt/oraInventory/logs/installActionsTTT.log。
类似的东西(我没有测试过这个,因为在我的安装中我不需要进度输出):
$ /directory_path/runInstaller -silent -responseFile responsefilename |
(
while read l ;
do
echo "$l" &&
if expr "$l" : "Preparing to launch Oracle Universal Installer from " >/dev/null
then
t=$(expr "$1" : ".*OraInstall\([^.]*\)") &&
log="/opt/oraInventory/logs/installActions${t}.log" &&
tail -f "$log" &
tpid=$!
fi
done
if [ -n "$tpid" ]
then
kill $tpid
fi
#[1]
)
...我们还可以判断安装是否成功,因为通用安装程序总是通过两行将其退出状态放入日志中:
INFO: Exit Status is 0
INFO: Shutdown Oracle Database 11g Release 2 Installer
...所以通过添加到上面的 #[1] ...
exitStatus=$(expr $(grep -B1 "$log" | head -1) : "INFO: Exit Status is\(.*\)") &&
exit $exitStatus
...仅当 oracle 安装成功完成时,上述“脚本”才会以 0 状态退出。
(请注意,在上面由 expr 捕获的状态中包含空格是故意的,因为如果匹配的子字符串字面意思是“0”,那么奇怪地 expr 以状态 1 退出)
令人震惊的是,oracle 在 linux/unix 上为通用安装程序“后台”设置了这么多麻烦,因为:
客户通常在后台运行脚本是微不足道的:
runInstaller xyz & ... 或... setid runInstaller xyz
it is very difficult (as we can see above) to wait for a "buried" background process to finish, and it cannot be done generically
Oracle would have saved themselves and everyone else lots of effort by just running the universal installer syncronously from runInstaller/.oui.