2

我正在运行一个脚本来安装带有静默选项和响应文件的 Oracle DB 11g。

执行命令后我注意到了shell

$ /directory_path/runInstaller -silent -responseFile responsefilename

安装会话刚刚关闭,只给了我一个日志文件位置。

安装过程在后台处于活动状态。但对我来说,进度和正在发生的事情对我来说没有办法……直到运行根脚本的提示出现。如果我关闭腻子窗口等怎么办?

有什么方法可以让安装程序会话保持活动状态直到完成?并在屏幕上显示某种进展?

4

4 回答 4

5

有什么方法可以让安装程序会话保持活动状态直到完成?

是的,您可以等待 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.

于 2013-07-25T05:53:49.447 回答
1

我发现一个有用的选项是-waitforcompletionand -nowaitfor windows。setup.exe 将等待完成,而不是生成 java 引擎并退出。

但仍在尝试找出一种在运行 runInstaller 时自动跟踪该日志文件的方法。

更新:最后,这是唯一对我有用的解决方案。

LOGFILE=$(echo /path/oraInventory/logs/$(ls -t /path/oraInventory/logs | head -n 1))

./runInstaller -silent -responseFile /path/db.rsp -ignorePrereq 

grep -q 'INFO: Shutdown Oracle Database' $LOGFILE
while [[ $? -ne 0 ]] ; do
    tail -1 $LOGFILE
    grep -q 'INFO: Shutdown Oracle Database' $LOGFILE
done

不是跟踪 oraInventory 中的最新日志,而是保持进程处于活动状态,直到最后一条消息写入日志文件。老学校,但工作。

于 2013-07-11T07:28:59.323 回答
0

我已经有一段时间没有安装了,但我认为你不能让它留在前台;它只是启动 JVM,并且直到最后都不会(AFAIK)产生任何控制台输出,无论如何你都会看到,所以它对你没有多大帮助。

不过,您应该在您的logs目录下的目录中查看很多内容,该目录在您为安装创建或已经拥有oraInventory的文件中标识,并且可能已在命令行中指定。oraInst.loc您提到它告诉您日志文件在其启动时的位置,因此这似乎是一个不错的起点。该installActions目录中的日志将为您提供比您可能想要的更多的详细信息。

如果您确实关闭了终端,则silentInstalloraInstall日志会告诉您何时root需要运行脚本,后者甚至会以百分比的形式为您提供进度 - 尽管我不确定这有多可靠。

拖尾oraInstallorinstallActions文件可能是您可以在屏幕上显示某种进度的唯一方法。我想,“沉默”是双向的。

于 2013-07-04T18:13:22.403 回答
0

您可能想要“跟踪”在 /tmp/OraInstallXXX 目录下生成的最新日志(ls -t 会给出)。

于 2013-07-11T07:58:09.870 回答