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