Shell Script, SCP com Zenity [RESOLVIDO]

1. Shell Script, SCP com Zenity [RESOLVIDO]

Eduardo Alberto da Silva Amaral
flandatico

(usa Ubuntu)

Enviado em 31/08/2011 - 17:27h

Olá!

estou com uma dúvida e gostaria de saber se a comunidade pode me ajudar.

seguinte, estou desenvolvendo um script para enviar arquivos por SCP utilizando a interface gráfica, na verdade quero enviar cerca de 60 PNG's.

O problema ocorre quando o usuário pressiona os botões cancelar ou fechar. Neste ponto o script deveria parar o envio e continuar no próximo ponto.
Mas a janela fecha, porém o envio scp continua em background. eu quero pará-lo
pensei em matar esse processo através do PID, mas não sei ainda como obter o PID deste subprocesso, somente o do script($$). E, pior ainda, parece que o bash está gerando um PID para cada vez que envia um png, ou seja, 60 PIDs

Aqui está o trecho do script:
.
.
.
#O diretório está vazio??
files=$(ls $DIR/ | wc -l);

if [ "$files" = 0 ]
then
zenity --error --width=300 --height=90 \
--title="Erro" \
--text="O diretório $DIR está vazio" \
return;
else
(
i=0
for arq in `seq 0 $files` ; do
echo $arq
scp -p $DIR/*.png USER@$IP_CLI:$RMT_DIR &>/dev/null
sleep 0.5
done
)|zenity --progress --percentage=0 --auto-close \
--title="Enviando.." \
--text="Enviando $ARQ, aguarde" \

#Agora quero saber se o usuário escolheu a opção cancelar ou fechar para, então fechar o programa

#if [ "$processo_SCP" = 1 ]
#then
#kill -9 $processo_SCP
#fi
fi

.
.
.

Este é só um trecho. alterei algumas coisas para exemplificar melhor.

Agradeceria se alguém pudesse me dar uma força.

Obrigado!!


  


2. Re: Shell Script, SCP com Zenity [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 31/08/2011 - 17:40h

Mate com um killall:

# killall scp


3. Re: Shell Script, SCP com Zenity [RESOLVIDO]

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 31/08/2011 - 19:08h

Para capturar o PID do processo basta usar o valor guardado em

$!

Ele guarda o valor o PID do último processo executado ;-)

PID_DO_PROCESSO="$!"
Ai depois use o seu kill -9 $PID_DO_PROCESSO

Abraços


4. Resolvido

Eduardo Alberto da Silva Amaral
flandatico

(usa Ubuntu)

Enviado em 19/11/2013 - 07:20h

Nossa!
Hoje, depois de um bom tempo, enquanto pesquisava algumas coisas na internet, encontrei este tópico que eu mesmo criei e resolvi postar a solução que encontrei para o meu problema. Não é a solução mais inteligente, mas funciona:

Meus scripts são sempre divididos em funções e esta é uma das que enviam arquivos via SCP e informam o progresso com o Zenity:

Envia_Arquivos()
{
while [ "${DIRETORIO}" = "" ];
do
DIRETORIO=$(zenity --list --width=300 --height=280 \
--title="Titulo da Caixa" \
--text "Escolha um diretório" \
--column "Diretório" \
"Diretório_1" \
"Diretório2" \
"Diretório3" \
"Diretório4" \
"Diretório5");

#Esta aqui é só uma função que verifica se o usuário escolheu a opção Sair/Cancelar. Eu sempre a chamo depois de uma caixa de diálogo. O que ela faz é testar o código de retorno do último comando, neste caso, o Zenity e, se o código for diferente de zero, então a execução do script é finalizada, senão, a vida segue.
RETORNO=$?
Verif_Exit ${RETORNO}


#Verifica se o diretório escolhido escolhida existe e/ou está vazio:
LOOP=$(ls -ltr ${DIR}/${DIRETORIO}/ 2> /dev/null | wc -l )

if [ ${LOOP} -gt 0 ]
then
(
for CONTADOR in $( seq 0 ${LOOP})
do
#Calcula a porcentagem que será exibida na barra de progresso
PROGRESSO=$(echo "(${CONTADOR}*100)/${LOOP}" | bc)

#Atualiza a barra de progresso
echo "${PROGRESSO}"

#Informa o progresso na caixa de diálogo
echo "# Enviando ${DIRETORIO}.\n${CONTADOR} de ${LOOP}, ${PROGRESSO}% concluído."
sleep 0.1

#Envia os arquivos para o servidor. OBS.: É importante ativar a troca de chaves SSH, para que o sistema não fique pedindo a senha.
scp ${DIR}/${DIRETORIO}/Arquivo.png ${USER_DESTINO}@${IP_DESTINO}:${DIR}/${DIRETORIO}/ &> /dev/null

# Alinha abaixo exibe a caixa de diáligo. Aqui está a resposta para minha pergunta. A opção que finaliza o processo quando o usuário decide fazê-lo é a opção "--auto-kill".
done) | zenity --progress --auto-close --auto-kill --percentage=0 --width=230 --height=100 --title="Titulo da Caixa"

else
#Diretório não encontrado
(zenity --error \
--window-icon="error" \
--title="Titulo da Caixa" \
--text="\"${DIRETORIO}\" não encontrado.")
return 1;
fi
RETORNO=$?
Verif_Exit ${RETORNO}
done
}


Então é isto pessoal, este é só um trecho adaptado do meu código. O importante aqui é mostrar a lógica que adotei e espero que sirva para mais gente.
Abraço!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts