ablog

不器用で落着きのない技術者のメモ

インストール中にsttyコマンドによって発生するエラーの防止

Oracle Grid Infrastructureインストレーション・ガイド 11gリリース2(11.2)for Linux B56271-01
の以下の記述の意味がよくわからないので調べてみました。

2.14.5 インストール中にsttyコマンドによって発生するエラーの防止

Oracle Grid Infrastructureのインストール中、OUIは、SSHを使用してコマンドを実行したり、他のノードにファイルをコピーします。 システム上の隠しファイル(.bashrcや.cshrcなど)にsttyコマンドが含まれていると、インストール中にMakeファイルやその他のインストールに関するエラーが発生します。

この問題を防止するには、すべてのSTDERR出力が停止されるように、Oracleインストール所有者ユーザーのホーム・ディレクトリにあるこれらのファイルを変更する必要があります。次に例を示します。

Bourne、BashまたはKornシェル:

if [ -t 0 ]; then
   stty intr ^C
fi

Cシェル:

test -t 0
if ($status == 0) then
   stty intr ^C
endif

注意:
SSHを使用できない場合、インストーラは、sshおよびscpコマンドのかわりにrshおよびrcpを使用します。
リモート・シェルによってロードされる隠しファイルにsttyコマンドが含まれている場合も、エラーが発生し、インストールが停止されます。

クラスタ用Oracle Grid Infrastructureの拡張インストール前の作業

OUI(Oracle Universal Installer)は「^C」でSIGINT(割り込み)シグナルを送信する実装になっている。例えば、.bash_profle の中で「stty intr ^D」と記述されている場合、OUIから「^C」を送信しても割り込みシグナルとは判断されず想定通り動作しない。よって、「if [ -t 0 ]; then」、つまり標準入力がオープンしている場合、割り込みシグナルを「^C」に設定している。ということ?


例えば、以下のように .bashrc に追記してやればよいと思われる。.bashrc に記述することで、ログイン時も対話型シェル起動時も追記した設定が有効になる。そもそも以下のケースでは割り込みシグナルをデフォルトから変更していないので、「stty intr ^C」を追記する必要なさそうですが。

  • .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions

# for Oracle
if [ -t 0 ]; then
   stty intr ^C
fi
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

参考


追記(2010/12/29):

よって、「if [ -t 0 ]; then」、つまり標準入力がオープンしている場合、割り込みシグナルを「^C」に設定している。ということ?

プロセスが標準入力のファイルディスクリプタをオープンしている場合は、「Ctrl + C」で割り込みシグナルを送るようにしてるということで、別にif文なくても良い気がしますが、あるほうがきめ細やかですね。

stty intr ^C

の「^C」の記述は見たままの文字を記述すればOKか確認してみましたが、OKでした。

[oracle@node01 ~]$ vi .bash_profile
stty intr ^A
[oracle@node01 ~]$ source .bash_profile 
[oracle@node01 ~]$ stty -a
speed 38400 baud; rows 40; columns 157; line = 0;
intr = ^A; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
[oracle@node01 ~]$ tail -f -n 1 .bash_profile 
stty intr ^A
<「Ctrl + A」を入力する>
[oracle@node01 ~]$ ← プロンプトが返ってくる