Introdução
Os processos Linux são componentes fundamentais do sistema operacional que executam programas e realizam tarefas. Ao desenvolver scripts de shell, é frequentemente necessário executar múltiplos processos simultaneamente e garantir que eles sejam concluídos antes de prosseguir com operações subsequentes.
Neste laboratório, você aprenderá sobre o comando wait em scripts de shell Linux. Esta ferramenta poderosa permite que processos pai pausem a execução até que seus processos filhos em segundo plano (background) sejam concluídos. Ao dominar as técnicas de espera de processos, você pode criar scripts mais eficientes que coordenam adequadamente múltiplas operações concorrentes.
Compreender a espera de processos é essencial para a administração de sistemas, automação e desenvolvimento de scripts de shell robustos. Você aprenderá como iniciar processos em segundo plano, esperar por sua conclusão e lidar com seus estados de saída para garantir um fluxo de execução confiável.
Entendendo Processos Linux e Execução em Segundo Plano
Nesta etapa, você aprenderá sobre processos Linux e como executar comandos em segundo plano usando o operador &.
O que são Processos Linux?
Um processo no Linux é uma instância de um programa em execução. Cada processo tem um ID de Processo (PID - Process ID) único e é executado independentemente de outros processos. Quando você executa um comando no terminal, você inicia um processo.
Executando Processos em Segundo Plano
Normalmente, quando você executa um comando no terminal, você precisa esperar que ele seja concluído antes de poder executar outro comando. No entanto, você pode executar um comando em segundo plano anexando um "e comercial" & ao final do comando.
Vamos experimentar isso:
Navegue até o diretório do seu projeto:
cd ~/projectCrie um script simples que simula uma tarefa de longa duração:
nano long_task.shAdicione o seguinte conteúdo ao script:
#!/bin/bash echo "Starting long task with PID $$" sleep 5 echo "Long task completed"Salve o arquivo pressionando
Ctrl+O, depoisEntere saia comCtrl+X.Torne o script executável:
chmod +x long_task.shExecute o script normalmente:
./long_task.shVocê verá uma saída como:
Starting long task with PID 1234 Long task completedObserve que você teve que esperar o script ser concluído antes de obter o prompt de comando de volta.
Agora execute o script em segundo plano:
./long_task.sh &Você verá uma saída como:
[1] 1235 Starting long task with PID 1235O
[1]é o número do trabalho (job number), e1235é o PID. Observe que você recebe o prompt de comando de volta imediatamente.Após cerca de 5 segundos, você verá:
Long task completed [1]+ Done ./long_task.shIsso indica que o processo em segundo plano foi concluído.
Quando você executa um comando em segundo plano, o shell não espera que ele seja concluído antes de permitir que você insira mais comandos. Isso é útil para executar múltiplas tarefas simultaneamente.
Usando o Comando wait para Sincronizar Processos
Nesta etapa, você aprenderá como usar o comando wait para sincronizar processos, fazendo com que o processo pai espere a conclusão dos processos em segundo plano.
O que é o Comando wait?
O comando wait é usado em scripts de shell para pausar a execução do script até que um ou mais processos em segundo plano sejam concluídos. Isso é particularmente útil quando você precisa garantir que certas tarefas terminem antes de prosseguir com operações subsequentes.
Usando wait Sem Argumentos
Quando usado sem argumentos, o comando wait espera que todos os processos em segundo plano sejam concluídos.
Vamos criar um script que demonstra isso:
Navegue até o diretório do seu projeto:
cd ~/projectCrie um novo script:
nano wait_demo.shAdicione o seguinte conteúdo ao script:
#!/bin/bash echo "Starting background tasks..." ## Start two background tasks ./long_task.sh & ./long_task.sh & echo "Waiting for all background tasks to complete..." wait echo "All background tasks have completed!"Salve e saia do editor pressionando
Ctrl+O, depoisEntere, finalmente,Ctrl+X.Torne o script executável:
chmod +x wait_demo.shExecute o script:
./wait_demo.shVocê verá uma saída semelhante a:
Starting background tasks... Starting long task with PID 1236 Starting long task with PID 1237 Waiting for all background tasks to complete... Long task completed Long task completed All background tasks have completed!
Observe que a mensagem "All background tasks have completed!" (Todas as tarefas em segundo plano foram concluídas!) só aparece depois que ambas as tarefas longas terminaram. Isso demonstra como o comando wait pausa o script até que todos os processos em segundo plano sejam concluídos.
Usando wait com um PID Específico
Você também pode usar wait para esperar por um processo específico, fornecendo seu PID:
Crie outro script:
nano wait_pid_demo.shAdicione o seguinte conteúdo:
#!/bin/bash echo "Starting background tasks..." ## Start two background tasks and capture their PIDs ./long_task.sh & pid1=$! ./long_task.sh & pid2=$! echo "First process PID: $pid1" echo "Second process PID: $pid2" echo "Waiting for the first task to complete..." wait $pid1 echo "First task has completed!" echo "Waiting for the second task to complete..." wait $pid2 echo "Second task has completed!"Salve e saia do editor pressionando
Ctrl+O, depoisEntere, finalmente,Ctrl+X.Torne o script executável:
chmod +x wait_pid_demo.shExecute o script:
./wait_pid_demo.shA saída mostrará que o script espera por cada processo individualmente.
A variável $! contém o PID do processo em segundo plano executado mais recentemente. Isso permite que você capture e use posteriormente o PID com o comando wait.
Tratando o Status de Retorno do Comando wait
Nesta etapa, você aprenderá como capturar e lidar com o status de retorno do comando wait, que reflete o status de saída dos processos em segundo plano.
Compreendendo o Status de Saída e Retorno
No Linux, cada comando retorna um status de saída quando é concluído. Um status de saída de 0 normalmente indica sucesso, enquanto um valor diferente de zero indica um erro ou alguma forma de falha.
O comando wait retorna o status de saída do comando aguardado. Se vários processos forem aguardados, ele retorna o status de saída do último processo que foi terminado.
Vamos criar scripts para demonstrar isso:
Navegue até o diretório do seu projeto:
cd ~/projectCrie um script que seja bem-sucedido:
nano success_task.shAdicione o seguinte conteúdo:
#!/bin/bash echo "Starting success task" sleep 2 echo "Success task completed successfully" exit 0 ## Exit with success statusSalve e saia pressionando
Ctrl+O, depoisEntere, finalmente,Ctrl+X. Em seguida, torne-o executável:chmod +x success_task.shCrie um script que falhe:
nano fail_task.shAdicione o seguinte conteúdo:
#!/bin/bash echo "Starting fail task" sleep 3 echo "Fail task encountered an error" exit 1 ## Exit with error statusSalve e saia pressionando
Ctrl+O, depoisEntere, finalmente,Ctrl+X. Em seguida, torne-o executável:chmod +x fail_task.shAgora crie um script que capture o status de espera:
nano wait_status_demo.shAdicione o seguinte conteúdo:
#!/bin/bash echo "Running a successful background task..." ./success_task.sh & wait wait_status=$? echo "Wait returned with status: $wait_status" if [ $wait_status -eq 0 ]; then echo "The background task succeeded!" else echo "The background task failed with status: $wait_status" fi echo "" echo "Running a failing background task..." ./fail_task.sh & wait wait_status=$? echo "Wait returned with status: $wait_status" if [ $wait_status -eq 0 ]; then echo "The background task succeeded!" else echo "The background task failed with status: $wait_status" fiSalve e saia pressionando
Ctrl+O, depoisEntere, finalmente,Ctrl+X. Em seguida, torne-o executável:chmod +x wait_status_demo.shExecute o script:
./wait_status_demo.shVocê verá uma saída semelhante a:
Running a successful background task... Starting success task Success task completed successfully Wait returned with status: 0 The background task succeeded! Running a failing background task... Starting fail task Fail task encountered an error Wait returned with status: 1 The background task failed with status: 1
Isso demonstra como você pode usar o status de retorno do comando wait para determinar se os processos em segundo plano foram concluídos com sucesso ou não, o que é essencial para o tratamento de erros em scripts de shell.
Concluindo uma Aplicação Prática
Nesta etapa final, você aplicará o que aprendeu para criar um script mais complexo que simula um processo de preparação do sistema. Este script coordenará várias tarefas em segundo plano e garantirá que todas sejam concluídas com sucesso antes de prosseguir.
Criando os Scripts de Preparação
Primeiro, criaremos dois scripts que simulam diferentes tarefas de preparação:
Navegue até o diretório do seu projeto:
cd ~/projectCrie o primeiro script de preparação:
nano decorate_hall.shAdicione o seguinte conteúdo:
#!/bin/bash echo "Decorating the hall..." sleep 3 echo "Hanging decorations..." sleep 2 echo "Decoration complete." exit 0Salve e saia pressionando
Ctrl+O, depoisEntere, finalmente,Ctrl+X. Em seguida, torne-o executável:chmod +x decorate_hall.shCrie o segundo script de preparação:
nano cook_feast.shAdicione o seguinte conteúdo:
#!/bin/bash echo "Preparing ingredients..." sleep 2 echo "Cooking main dishes..." sleep 3 echo "Preparing desserts..." sleep 1 echo "Cooking complete." exit 0Salve e saia pressionando
Ctrl+O, depoisEntere, finalmente,Ctrl+X. Em seguida, torne-o executável:chmod +x cook_feast.sh
Criando o Script de Coordenação Principal
Agora, vamos criar o script principal que coordenará essas tarefas de preparação:
Crie o script principal:
nano prepare_feast.shAdicione o seguinte conteúdo:
#!/bin/bash echo "=== Preparation Ceremony Started ===" echo "Starting all preparation tasks..." ## Start the preparations in the background ./decorate_hall.sh & decoration_pid=$! ./cook_feast.sh & cooking_pid=$! echo "All tasks started. Waiting for completion..." ## Wait for decoration to finish wait $decoration_pid decoration_status=$? if [ $decoration_status -eq 0 ]; then echo "Decoration completed successfully." else echo "Error: Decoration failed with status $decoration_status" exit 1 fi ## Wait for cooking to finish wait $cooking_pid cooking_status=$? if [ $cooking_status -eq 0 ]; then echo "Cooking completed successfully." else echo "Error: Cooking failed with status $cooking_status" exit 1 fi ## All preparations completed successfully echo "=== All preparations completed successfully! ===" echo "The ceremony can now begin." ## Create a verification file to indicate successful completion echo "decoration_status=$decoration_status" > preparation_results.txt echo "cooking_status=$cooking_status" >> preparation_results.txt echo "overall_status=0" >> preparation_results.txt exit 0Salve e saia pressionando
Ctrl+O, depoisEntere, finalmente,Ctrl+X. Em seguida, torne-o executável:chmod +x prepare_feast.shExecute o script principal:
./prepare_feast.shVocê verá a saída de todas as tarefas de preparação sendo executadas simultaneamente, e o script principal esperando que cada uma seja concluída antes de declarar o sucesso geral.
Compreendendo o Script
Vamos examinar as partes principais do script principal:
- Iniciamos cada tarefa de preparação em segundo plano usando
& - Capturamos o PID de cada tarefa usando
$! - Esperamos que cada tarefa seja concluída usando
wait $pid - Verificamos o status de saída de cada tarefa
- Criamos um arquivo de verificação com os resultados
Essa abordagem nos permite:
- Executar várias tarefas simultaneamente
- Monitorar o sucesso/falha de cada tarefa
- Interromper o processo geral se alguma tarefa individual falhar
- Criar um registro dos resultados
Este é um padrão comum em scripts de administração e automação de sistemas, onde vários processos precisam ser coordenados e monitorados.
Resumo
Neste laboratório, você aprendeu a gerenciar e sincronizar processos de forma eficaz no Linux usando o comando wait. Essa habilidade importante permite que você crie scripts de shell mais sofisticados que podem coordenar várias operações simultâneas.
Os principais conceitos que você dominou incluem:
- Executar processos em segundo plano usando o operador
& - Usar o comando
waitpara pausar a execução até que os processos em segundo plano sejam concluídos - Esperar por processos específicos por seu PID
- Capturar e lidar com o status de retorno do comando
wait - Implementar tratamento de erros para processos em segundo plano
- Coordenar várias tarefas simultâneas em um cenário prático
Essas habilidades são fundamentais para administração de sistemas, automação e scripting de shell em ambientes Linux. Ao gerenciar adequadamente a sincronização de processos, você pode criar scripts mais eficientes que utilizam a concorrência, mantendo a sequência adequada de operações dependentes.
Se você está desenvolvendo sistemas de compilação, scripts de implantação ou ferramentas de administração de sistemas, a capacidade de coordenar vários processos é uma habilidade essencial que permitirá que você crie soluções mais poderosas e eficientes.



