送信されたテキストとインストールファイルを処理する代わりに終了する予定のスクリプトがあります。ファイルをインストールしない理由を特定しようとしています。つまり、期待どおりにプロセスを実行するのではなく、手動でプロセスを実行しても、実行するアクションは実装されません。
私のスクリプトには次のコードがあります。
#!/usr/bin/expect
set exp_internal 1
set timeout 30
set java [lindex $argv 0];
set installer [lindex $argv 1];
spawn $java -jar $installer -console
expect {
"*More*" { send " "; exp_continue }
"Press 1 to accept, 2 to reject, 3 to redisplay" { send "1\r" }
}
expect "Select the installation path:*" { send "/opt/pentaho8.3\r" }
expect "Press 1 to continue, 2 to quit, 3 to redisplay\r\n" { send "1\r" }
close
exit
次のようにスクリプトを実行すると:
$ sudo /usr/bin/expect -d install-pentaho.expect /usr/java/jdk1.8.0_261/bin/java pentaho-server-manual-ee-8.3.0.0-371/installer.jar
最後の数行を除いて、期待どおりに実行されます。
send: sending "/opt/pentaho8.3\r" to { exp6 }
expect: does "" (spawn_id exp6) match glob pattern "Press 1 to continue, 2 to quit, 3 to redisplay\r\n"? no
/opt/pentaho8.3
expect: does "/opt/pentaho8.3\r\r\n" (spawn_id exp6) match glob pattern "Press 1 to continue, 2 to quit, 3 to redisplay\r\n"? no
Press 1 to continue, 2 to quit, 3 to redisplay
expect: does "/opt/pentaho8.3\r\r\n\r\nPress 1 to continue, 2 to quit, 3 to redisplay\r\n" (spawn_id exp6) match glob pattern "Press 1 to continue, 2 to quit, 3 to redisplay\r\n"? yes
expect: set expect_out(0,string) "Press 1 to continue, 2 to quit, 3 to redisplay\r\n"
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "/opt/pentaho8.3\r\r\n\r\nPress 1 to continue, 2 to quit, 3 to redisplay\r\n"
send: sending "1\r" to { exp6 }
Expectから送られた「1」がなぜ無視されるのか気になる方はいらっしゃいますか?送信された「1」を無視し、生成されたプロセスが終了するようです。
sudo /usr/java/jdk1.8.0_261/bin/java -jar pentaho-server-manual-ee-8.3.0.0-371/installer.jar
-consoleを手動で実行したときに得られる予想される出力は次のとおりです。
Select the installation path: [/root/pentaho/pentaho-server-manual-ee-8.3.0.0-371]
/opt/pentaho8.3
Press 1 to continue, 2 to quit, 3 to redisplay
1
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Installation
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[ Starting to unpack ]
[ Processing package: Base (1/1) ]
[ Unpacking finished ]
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Installation Finished
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Installation was successful
Application installed on /opt/pentaho8.3
[ Console installation done ]
インストールが発生せず、予想されるスクリプトが早期に終了した理由についてのアイデアはありますか?
答え1
問題は、Javaプログラムへの接続を閉じることであるため、一部のメッセージを書き込むとSIGPIPEを受信して終了することです。
(インストールに30秒以上かかる場合はタイムアウトを調整できます)close
に変更してください。これにより、プログラムが完了するまで(または少なくとも標準出力が閉じるまで)待ちますexpect eof
。expect