Eu tenho algumas máquinas Linux e cada uma delas tem alguns bancos de dados Oracle. Em cada máquina temos 2 shell scripts para executar os backups. O planejador do TSM chama um script que chama um script de backup diferente para cada banco de dados na máquina.
O problema é que, se eu criar uma matriz de SIDs e criar um loop pelos SIDs, o backup falhará.
#!/bin/bash
LEVEL="$1"
declare -a SIDS=('SID1' 'SID2' 'SID3')
su - oracle
for SID in ${SIDS[@]}
do
ORACLE_SID=$SID; export ORACLE_SID
export ORACLE_HOME='/u01/app/oracle/product/10.2.0.2'
ORAENV_ASK=NO
. /usr/local/bin/oraenv
LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH
/usr/local/adm/backup-incrn.sh $LEVEL $SID 35
done
Não há erro nos Logs no servidor TSM e é quase como se os scripts nunca fossem chamados. Os logs que estão na máquina não são atualizados com nenhuma mensagem de erro.
Se eu usar essa sintaxe os backups funcionarão perfeitamente
su - oracle -c "/usr/local/adm/backup-incrn.sh $LEVEL SID1 35"
su - oracle -c "/usr/local/adm/backup-incrn.sh $LEVEL SID2 35"
Acho que deve ser um erro no meu script, alguma variável não sendo configurada corretamente.
Alguém pode ver o erro óbvio que cometi e apontá-lo para mim?
Gisli
Eu imagino que, como você está emitindo um login, sua declaração de SIDS não é transferida para o shell iniciado pelo comando su. Você pode testar isso verificando o valor de SIDS depois de emitir o "su - oracle"
Remova essa linha do script. Você pode alternar o usuário antes de executar o script. se você alternar o usuário no script de shell, ele fornecerá um novo ambiente de shell, perdendo mais instruções de shell. (existem outras formas de fazer)