Você estava muito perto da solução. Anaconda (o instalador) é escrito em Python, então eu fui cavar o código.
Por fim, ele executa o script assim:
rc = iutil.execWithRedirect(self.interp, ["/tmp/%s" % os.path.basename(path)],
stdin = messages, stdout = messages, stderr = messages,
root = scriptRoot)
Um pouco mais de escavação e você pode encontrar o iutil.execWithRedirect definido em 'iutil.py'. Essa função usa subprocess.Popen (um Python interno) para executar o comando. Também tenta muito obter o conteúdo de STDOUT e STDERR do script% pre.
O código é assim:
#prepare tee proceses
proc_std = tee(pstdout, stdout, program_log.info, command)
proc_err = tee(perrout, stderr, program_log.error, command)
#start monitoring the outputs
proc_std.start()
proc_err.start()
proc = subprocess.Popen([command] + argv, stdin=stdin,
stdout=pstdin,
stderr=perrin,
preexec_fn=chroot, cwd=root,
env=env)
proc.wait()
ret = proc.returncode
#close the input ends of pipes so we get EOF in the tee processes
os.close(pstdin)
os.close(perrin)
#wait for the output to be written and destroy them
proc_std.join()
del proc_std
proc_err.join()
del proc_err
Então, com o que você tem, você passa das chamadas proc.wait () e os.close bifurcando-se em segundo plano.
proc_std e proc_err são segmentos que repetidamente chamam readline no STDOUT e STDERR. Eles continuam lendo até que o EOF seja encontrado. Como o script herda o soquete STDOUT e STDERR do script% pre, eles nunca encontrarão EOF. Ananconda então trava esperando o segmento ler STDOUT para sair (na linha 'proc_std.join ()'), o que nunca acontece.
É uma questão muito confusa, mas, no final das contas, uma correção muito simples. Em vez de:
/bin/sh /tmp/rpm_watcher.sh &
use
/bin/sh /tmp/rpm_watcher.sh > /dev/null 2>&1 < /dev/null &
Isso garante que seu script não herde STDOUT e STDERR, então o Anaconda não trava e a instalação pode continuar.