Introdução
Quando um script é executado, ele geralmente cria arquivos temporários ou inicia processos em segundo plano. Se o usuário interromper o script, por exemplo, pressionando Ctrl+C, esses arquivos temporários podem permanecer no sistema e gerar desorganização.
Para evitar isso, os scripts precisam detectar quando estão sendo interrompidos e executar as ações de limpeza necessárias.
No Linux, usamos o comando trap para capturar sinais de interrupção e eventos de saída. Os sinais são uma das formas usadas pelo sistema operacional para se comunicar com os processos. Por exemplo, pressionar Ctrl+C normalmente envia SIGINT, solicitando que o processo seja interrompido.
Isso permite definir um procedimento “ao sair”, para que o script possa limpar seus próprios recursos antes de terminar.
Neste laboratório, você vai:
- Criar um script que gera arquivos temporários.
- Interromper o script para ver o que permanece no sistema.
- Implementar um trap para excluir automaticamente os arquivos temporários durante a saída.
Criar um processo de longa duração
Primeiro, crie um script que simule uma tarefa de longa duração. Ele criará um arquivo temporário e depois ficará em espera indefinidamente.
Scripts de longa duração são comuns em tarefas de administração. Eles podem monitorar um log, aguardar uma entrada, consultar um serviço periodicamente ou processar tarefas ao longo do tempo. Quanto mais tempo um script permanece em execução, mais importante é realizar a limpeza quando algo o interrompe.
Crie e abra long_process.sh no diretório do projeto:
cd ~/project
nano long_process.sh
Digite este código:
#!/bin/bash
## Create a temporary file
touch temp_data.txt
echo "Temporary file 'temp_data.txt' created."
## Fall asleep (Simulate a long job)
echo "Process is running. Press Ctrl+C to stop..."
while true; do
sleep 1
done
Salve (Ctrl+O, Enter) e saia (Ctrl+X).
Torne o script executável:
chmod +x long_process.sh
O problema: se você executar este script e depois interrompê-lo com Ctrl+C, o arquivo temp_data.txt permanecerá no disco. Isso é considerado uma prática inadequada, pois várias execuções podem ocupar espaço em disco com arquivos desnecessários.
Arquivos temporários são um exemplo clássico, mas o mesmo problema pode ocorrer com arquivos de bloqueio, sockets, pontos de montagem ou processos auxiliares em segundo plano. A limpeza serve para deixar o sistema em um estado previsível.
Definir uma função de limpeza
Para tratar a limpeza corretamente, a prática recomendada é definir uma função específica que contenha toda a lógica de limpeza.
Colocar a limpeza em uma função separada mantém o script organizado. Isso também permite reutilizar a mesma lógica em diferentes caminhos de saída, em vez de copiá-la para vários locais.
Abra o script novamente:
nano long_process.sh
Adicione a função cleanup no início do script:
#!/bin/bash
## Define the cleanup function
cleanup() {
echo ""
echo "Cleaning up temporary files..."
rm -f temp_data.txt
echo "Cleanup complete."
}
## Create a temporary file
touch temp_data.txt
echo "Temporary file 'temp_data.txt' created."
## Simulate a long-running process
echo "Process is running. Press Ctrl+C to stop..."
while true; do
sleep 1
done
Salve e saia.
Neste momento, definimos a função, mas ainda não informamos ao script quando chamá-la.
Configurar um trap para capturar sinais
Agora, use o comando trap para informar ao Bash: “Se você receber um sinal de interrupção, como Ctrl+C, execute a função cleanup”.
Este é um exemplo claro de um script de shell reagindo a eventos do sistema operacional, e não apenas a entradas de texto. Um sinal é uma mensagem assíncrona enviada pelo sistema ou pelo usuário a um processo, e trap dá ao script a oportunidade de responder de forma controlada.
Abra o script:
nano long_process.sh
Adicione o comando trap abaixo da definição da função, mas antes do início da lógica principal.
#!/bin/bash
cleanup() {
echo ""
echo "Cleaning up temporary files..."
rm -f temp_data.txt
echo "Cleanup complete."
exit
}
## Register the trap
## SIGINT = Ctrl+C
## EXIT = Any exit (success or failure)
trap cleanup SIGINT EXIT
## The rest of the script...
touch temp_data.txt
echo "Temporary file 'temp_data.txt' created."
echo "Process is running. Press Ctrl+C to stop..."
while true; do
sleep 1
done
Entendendo os argumentos do trap:
cleanup: o comando ou a função que será executado.SIGINT: o sinal enviado quando você pressionaCtrl+C.EXIT: um pseudo-sinal acionado sempre que o script termina, independentemente do motivo.
Usar SIGINT e EXIT torna a limpeza mais confiável. SIGINT cobre a interrupção comum pelo teclado, enquanto EXIT fornece uma proteção mais geral para o encerramento normal e para muitos casos de falha.
Salve e saia.
Verificar a limpeza
Agora, verifique se o mecanismo funciona.
Execute o script:
./long_process.sh
O script criará temp_data.txt e começará a ser executado.
Interrompa-o pressionando Ctrl+C.
Você deverá ver esta saída:
^C
Cleaning up temporary files...
Cleanup complete.
Por fim, verifique se o arquivo foi excluído:
ls temp_data.txt
O comando deverá retornar um erro semelhante a este:
ls: cannot access 'temp_data.txt': No such file or directory
O comando trap capturou o sinal de interrupção e executou o código de limpeza antes de o script terminar.
Este é um hábito importante em scripts profissionais: se um script cria um estado temporário, ele também deve definir como esse estado será removido. trap é uma das principais ferramentas fornecidas pelo Bash para essa finalidade.
Resumo
Neste laboratório, você aprendeu a escrever scripts robustos usando Trap.
- Sinais: entender que
Ctrl+Cenvia um sinalSIGINTao processo. - Trap: usar
trappara capturar sinais e executar um código específico. - Limpeza: automatizar tarefas de manutenção para manter o sistema organizado.
Scripts profissionais sempre tratam os cenários de saída para evitar corrupção de dados e arquivos que permaneçam no sistema.



