su -c falha ao enviar comandos db2

1

Eu tenho um script que eu configurei para executar uma série de tarefas, uma das quais é configurar uma tabela em um banco de dados e depois removê-lo (para testes automatizados).

A questão é que em apenas alguns dos usuários que eu uso o comando su - user -c , a chamada para db2 falha. O mais estranho é que usar su - user e executar o comando db2 funciona bem (fora do script). Isso só acontece depois de eu ter executado o script uma vez e durante o processo de execução do script (embora não haja nada que possa causar alterações de alguma forma, infelizmente não posso compartilhar o código exato, embora eu possa compartilhar um exemplo / recreação se isso ajudar), que contém apenas alguns loops básicos e um monte de comandos su - user -c chamando comandos IBM mq.

Por exemplo, isso falha:

su - user -c "db2 connect to database USER user USING pass; db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'"

Erro:

DB21016E The Command Line Processor encountered a system error while sending the command to the backend process.
DB21018E A system error occurred. The command line processor could not continue processing.

No entanto, isso funciona bem:

su - user
db2 connect to database USER user USING pass
db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'

Eu tentei gerar o comando env nos dois casos, para ver se há alguma coisa diferente, mas eles correspondem como seria de se esperar. Também tentei ajustar a ordem em que os diferentes usuários são executados, mas isso também não parece ajudar.

Estou realmente confuso e qualquer ajuda seria muito apreciada.

Estou usando um shell ksh.

    
por CheckovZA 20.03.2015 / 12:21

2 respostas

1

Eu tenho uma solução que parece funcionar.

Eu criei um script ksh separado que faz todos os comandos db2 (estabeleça uma conexão, crie uma tabela e conceda permissões a ela) e execute isso com quaisquer argumentos necessários.

Isso significa que ele está executando um conjunto de comandos em uma instância do su, apesar de usar a parte -c, para executá-lo no script com eficiência.

    
por 11.05.2015 / 15:17
0

O problema é que o ambiente para execução de comando usando su - user e su - user -c pode diferir e db2 precisa de alguma variável ausente, por exemplo, DB2INSTANCE a ser definido para funcionar corretamente. Comparar saída de:

$ su - user
# printenv

e

$ su - user -c printenv

Você pode então passar a variável em falta simplesmente assim:

$ su - user -c "export DB2INSTANCE=inst ; db2 connect to database USER user USING pass; db2 'CREATE TABLE LETABLE (LEFIELD VARCHAR (16))'"
    
por 20.03.2015 / 12:34

Tags