終了が予想され、送信された文字に応答がありません。

終了が予想され、送信された文字に応答がありません。

送信されたテキストとインストールファイルを処理する代わりに終了する予定のスクリプトがあります。ファイルをインストールしない理由を特定しようとしています。つまり、期待どおりにプロセスを実行するのではなく、手動でプロセスを実行しても、実行するアクションは実装されません。

私のスクリプトには次のコードがあります。

#!/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 eofexpect

関連情報