종료가 예상되며 보낸 문자에 응답이 없습니다.

종료가 예상되며 보낸 문자에 응답이 없습니다.

보낸 텍스트와 설치 파일을 처리하는 대신 종료되는 예상 스크립트가 있습니다. 파일을 설치하지 않는 이유를 알아내려고 노력 중입니다. 즉, 예상을 통해 프로세스를 실행하는 대신 프로세스를 수동으로 실행하면 수행할 작업을 구현하지 않습니다.

내 스크립트에는 다음 코드가 있습니다.

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

관련 정보