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インストール所有者ユーザーのホーム・ディレクトリにあるこれらのファイルを変更する必要があります。次に例を示します。
if [ -t 0 ]; then stty intr ^C fiCシェル:
test -t 0 if ($status == 0) then stty intr ^C endif注意:
クラスタ用Oracle Grid Infrastructureの拡張インストール前の作業
SSHを使用できない場合、インストーラは、sshおよびscpコマンドのかわりにrshおよびrcpを使用します。
リモート・シェルによってロードされる隠しファイルにsttyコマンドが含まれている場合も、エラーが発生し、インストールが停止されます。
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
# .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
参考
- http://www.tokaido.co.jp/syoko/handyman/stty.html
- Tty (Unix)とは - Weblio辞書
- wikipedia:シグナル_(ソフトウェア)
- .bash_profileと.bashrcの違いは
- bashの便利な機能を使いこなそう (2/2):Windowsユーザーに教えるLinuxの常識(9) - @IT
追記(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 ~]$ ← プロンプトが返ってくる