Como usar o trap + CTRL+C para finalizar shell script e bacground? [RESOLVIDO]

1. Como usar o trap + CTRL+C para finalizar shell script e bacground? [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 14/04/2012 - 10:43h

Estou com dificuldade para controlar a saída de um shell script que coloquei rodando em background.

Não quero trazer o shell script que está rodando usando fg porque assim está funcionando.
Se eu trago antes o sh que está em background para frente e depois teclo [CTRL+C] ele cancela o script de forma controlada usando a função que coloquei usando o trap

exemplo:


#!/bin/bash
# Script: myloop.sh
#-----------------------------------------------------------------------------#
# INÍCIO >>> function control_c()
#-----------------------------------------------------------------------------#
function FN_control_c()
{
echo
echo "#################################################"
echo "## Encerrando o DAEMON $(basename "$0") !!!! "
echo "#################################################"
echo
touch /tmp/services/minha_trava_ic.txt
exit 0
}
#-----------------------------------------------------------------------------#
#FIM >>> FN_control_c()
#-----------------------------------------------------------------------------#

rm /tmp/services/minha_trava_ic.txt

trap FN_control_c INT HUP TERM

minhaparada="50"
c="0"
while true ; do
./fila_i_c.sh 7 8 &
./fila_i_c.sh 7 7 &
./fila_i_c.sh 7 2 &
./fila_i_c.sh 7 1 &
./fila_i_c.sh 7 4 &
./fila_i_c.sh 7 5 &
c=$((c+1))
echo "Rodando $c vezes "
echo $$
sleep $minhaparada
done

exit 0



Note: Dentro do script estou chamando outros, e todos em background.
Quando eu carrego o meu script de teste myloop.sh também faço a chamada em background.
O problema é que se teclo [CTRL+C] e ele está rodando em bg não cancela de forma controloda e não cria o arquivo que está dentro da função.
Se não cria o arquivo, não consigo fazer todos os outros scripts que estão em bg finalizarem.

O que estou fazendo:

O script fila_i_c.sh está sendo bifurcado em vários processos usando os 2 parâmetros que o primeiro diz a máquina e o segundo é para mim um canal [ diretório ]

Como faz para que eu possa dar [CTRL+C] no "maledeto" e seja capturado pelo trap ?
Existe outra forma de fazer isso para finalizar um sh em bg sem envia-lo de volta via fg ou usando o kill para matar o processo ?

Se alguém tiver uma luz avisa aí. Por ora como sempre vou batendo lata procurando uma saída.

A base deste script foi encontrada aqui no VOL: http://www.vivaolinux.com.br/artigo/Daemons-com-shell-script?pagina=2

#Ga_Tux

ixi o site do VOL está dando mensagem conectando-se a vivaolinux. Estou na 5ª tentativa de salvar esta alteração.



  


2. Re: Como usar o trap + CTRL+C para finalizar shell script e bacground? [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 14/04/2012 - 15:32h

Continuo batendo lata fazendo as minhas correrias mas nada de achar a solução rsrs





3. Finalizar Shell Script com CTRL+C de forma controlada em BackGround

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 14/04/2012 - 20:33h

Problema RESOLVIDO !!!!

A dificuldade em controlar um script que está em background foi resolvida com um mínimo de alterações. Ainda não tenho certeza se esta é a saída ideal, mas agora se um topeira, uups, protusuário, uupss, teclador de equipamentos cibernéticos teclar CTRL+C durante a execução do script que está em bg ele vai abortar depois de um tempo finalizando todas operações e até mesmo todos os outros scripts que ele chamou em bg


#!/bin/bash
# Script: myloop.sh
#-----------------------------------------------------------------------------#
# INÍCIO >>> function control_c()
#-----------------------------------------------------------------------------#
function FN_control_c()
{
echo
echo "#################################################"
echo "## Encerrando o DAEMON $(basename "$0") !!!! "
echo "#################################################"
echo
touch /tmp/services/minha_trava_ic.txt
exit 0
}
#-----------------------------------------------------------------------------#
#FIM >>> FN_control_c()
#-----------------------------------------------------------------------------#

USER_INTERRUPT=13 # Varável global para verificar a interrupção do usuário.


rm /tmp/services/minha_trava_ic.txt

trap FN_control_c $USER_INTERRUPT TERM INT HUP SIGINT SIGTERM

minhaparada="50"
c="0"
while true ; do
./fila_i_c.sh 7 8 &
./fila_i_c.sh 7 7 &
./fila_i_c.sh 7 2 &
./fila_i_c.sh 7 1 &
./fila_i_c.sh 7 4 &
./fila_i_c.sh 7 5 &
c=$((c+1))
echo "Rodando $c vezes "
echo $$
sleep $minhaparada
done

exit 0



Dificilmente outro louco terá a mesma necessidade que tive, mas vai saber. kkk

Mesmo que exista 10 terminais abertos , o comando ps -aux vai lhe mostrar o processo rodando.
Para mata-lo use: kill -13 NumeroDoProcesso

Caso esteja no mesmo terminal que está rodando o script em bg é bem mais fácil. Use: kill $(jobs -p)

CUIDADO: Este comando mata o processo do primeiro job que ele achar. Se tiver vários rodando neste terminal pode encerrar algum que não queira rsrs. O meu caso.

De qualquer modo, ele vai parar o job de forma controlada e irá executar o trap pegando os comandos que estão dentro da função.

Claro que outras alternativas serão bem vindas.










Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts