Um script chama o outro [RESOLVIDO]

1. Um script chama o outro [RESOLVIDO]

Leonardo Vinicius Dias da Silva
leomarie

(usa Slackware)

Enviado em 22/11/2011 - 16:47h

Caros amigos,

Estou com uma rotina de backup que gera um arquivo compactado de, aproximadamente 300MB. Tenho um outro script parecido com este, que gera uma arquivo de 1.5GB. Agendei na Cron o script1 e inseri nele, uma linha chamando o script2 "./script2". Porém, o script1 não espera terminar a execução do script2 para finalizar, e gera a mídia contendo somente o arquivo de 300MB, pois o outro ainda está sendo gerado. Como faço para informar ao script pai para aguardar a execução do script2 e só então continuar seus comandos?


  


2. Re: Um script chama o outro [RESOLVIDO]

Thiago Monaco
thi.monaco

(usa openSUSE)

Enviado em 22/11/2011 - 16:51h

Coloca a opção de gerar a midia no script 2... Simples...


3. Re: Um script chama o outro [RESOLVIDO]

Leonardo Vinicius Dias da Silva
leomarie

(usa Slackware)

Enviado em 22/11/2011 - 17:21h

É.. este recurso técnico eu já fiz..rs o detalhe é se inverterem o tamanho dos arquivos, por exemplo.. não tem uma forma de mandar o script pai esperar finalizar o filho e depois sim dar continuidade aos comandos?


4. Re: Um script chama o outro [RESOLVIDO]

Thiago Monaco
thi.monaco

(usa openSUSE)

Enviado em 22/11/2011 - 17:25h

Não sei... Até pke eu sou da lei do menor esforço IUHauiHA... Vou dar uma olhada...


5. Re: Um script chama o outro [RESOLVIDO]

Thiago Monaco
thi.monaco

(usa openSUSE)

Enviado em 22/11/2011 - 17:42h

Fiz outra forma pra executar o q vc quer...


Script 1

#!/bin/bash

if [ "$1" = "" ]
then
echo "Backup"

echo "Gerando arquivo 1"

#comando usado para gerar seu arquivo. Vou usar um pra teste aqui

echo "testando"

echo "Gerando arquivo 2"

/home/thiagom/Documentos/script/teste/script2.sh

elif [ "$1" = "save" ]

then
echo "seu comando de gravação aqui"
fi

exit




Script 2


#!/bin/bash

echo "..."

#seu comando para gerar o arquivo 2

echo "arquivo gerado"

/home/thiagom/Documentos/script/teste/script1.sh save



Ai é só executar o script1.sh

Ainda não achei um jeito do script pai esperar o script filho... Manjo nada d shell....


6. comandos wait e pid

M4iir1c10
m4iir1c10

(usa Arch Linux)

Enviado em 22/11/2011 - 19:13h

Voce pode usar o comando wait (espera) ou identificar o processo pelo pid

#!/bin/bash

declare seus comandos

#chame o script 2
$HOME/scripts/script2.sh

#declare que o script deve esperar a execucao terminar
wait

#segue a execucao
comando para gravar


usando o pid=

#!/bin/bash
declare seus comandos

#chame o script 2 e identifique o pid atravez do $!
$HOME/scripts/script2.sh $! > /tmp/script2.pid

#crie uma variavel para chegar se o pid esta rodando E enquanto estiver rodando com o loop while espere o script parar.

scriptid=$(cat /tmp/script2.pid)
verdadeiro=$(ps axo pid,cmd | grep $scriptid | awk '{print TRUE}')
while [ $verdadeiro = TRUE ]
do echo "esperando script2 terminar"
done

#remove o arquivo pid e continua

rm -f /tmp/script2.pid

segue o comando para gravar.

ha outra maneira de usar o pid do arquivo usando o comando pidof dentro de uma variavel, porem eu deixo a sua criatividade... eu nao sei se usar dois script e um criterio porem voce pode atingir o mesmo resultado usando apenas um script criando uma funcao executando ela e depois executando o demais comandos.

#/!bin/bash

comando para backup

function script2(){
comando do script 2
}

#chama a funcao
script2

comando para gravar






7. Re: Um script chama o outro [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 22/11/2011 - 21:39h

Acho que consegui um jeito até simples, veja:


#!/bin/bash
./script1.sh &

while ps aux | egrep "*script1\.sh$" >/dev/null
do
echo 'executando script1...'
#para não consumir muitos recursos da máquina
sleep 5
done

echo 'executando script2'


Com isso enquanto o script1.sh estiver em execução o script2 (ou qualquer outro nome) continuará dentro do while, esperando ele terminar para continuar sua execução...

Abraços


8. Re: Um script chama o outro [RESOLVIDO]

Adriano Moreira da Silva
adri3d

(usa Arch Linux)

Enviado em 22/11/2011 - 22:30h

rai3mb escreveu:

Acho que consegui um jeito até simples, veja:


#!/bin/bash
./script1.sh &

while ps aux | egrep "*script1\.sh$" >/dev/null
do
echo 'executando script1...'
done

echo 'executando script2'


Com isso enquanto o script1.sh estiver em execução o script2 (ou qualquer outro nome) continuará dentro do while, esperando ele terminar para continuar sua execução...

Abraços


solução interessante,eu apenas a acrescentaria um "sleep 5" dentro do while para ele não ficar consumindo recursos da maquina,

esses dias atras deixei por acidente 4 loops infinitos com um echo dentro rodando aqui, e acabou com o processador da maquina



9. Re: Um script chama o outro [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 22/11/2011 - 22:33h

Ops ;-)

Bem lembrado, fiz durante os testes, depois deixei apenas o que pensei ser necessário ;-)



10. Re: Um script chama o outro [RESOLVIDO]

Leonardo Vinicius Dias da Silva
leomarie

(usa Slackware)

Enviado em 23/11/2011 - 15:37h

Bom.. deixa eu ver se entendi... montem um outro script com o seguinte código:

#!/bin/bash
dir=/home/leo/scripts
bkp1=$dir/backupdiario.sh
bkp2=$dir/backuppaiva.sh
./$bkp1 &
while ps aux |egrep "*backupdiario\.sh$" >/dev/null
do
sleep 5
done
./$bkp2
exit

agendarei pra executar esta noite.. amanhã darei notícias..

Obrigado!


11. Resolvido!

Leonardo Vinicius Dias da Silva
leomarie

(usa Slackware)

Enviado em 24/11/2011 - 10:01h

Bom pessoal,

Com a ajuda de vocês, ficou assim:

Montei o script

#!/bin/bash
dir=/home/leo/scripts
bkp1=$dir/backupdiario.sh
bkp2=$dir/backuppaiva.sh
$bkp1 &
while ps aux |egrep "*backupdiario\.sh$" >/dev/null
do
sleep 5
done
$bkp2
exit

e joguei na cron... rodou perfeitamente!.. vlw!


12. Re: Um script chama o outro [RESOLVIDO]

João Paulo Carneiro
jptudobem

(usa Debian)

Enviado em 24/11/2011 - 11:24h

Eu ainda faria de uma outra forma:

No bkp1:


#!/bin/bash

PID="/var/run/bkp1.pid"
echo $$ > $PID

.......

rm $PID
exit 0;


No script final:


#!/bin/bash
PID="/var/run/bkp1.pid"
DIR="/home/leo/scripts"
BKP1="$DIR/backupdiario.sh"
BKP2="$DIR/backuppaiva.sh"

$BKP1 &

while test -f $PID
do
sleep 5
done

$BKP2
exit 0;









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts