Você está na página 1de 9

Programação Para Servidores

Aula - SubShell

Prof. Anderson Theobaldo


Visão Geral
 Definição
 Funcionamento
 Rotinas Paralelas
Definição

 Um subshell é uma instância separada do


processador de comandos.
 Cada execução de shell script é efetivamente um
subprocesso (processo filho) de um shell.
 Um shell script pode criar subprocessos.
Criando um SubShell
 Para criar um subshell dentro de um script, colocar os
comandos do subshell entre parênteses.
 Exemplo: teste_subshell.sh
(
while [ 1 ]
do
sleep 1
echo "Dentro do loop 1 ..."
done
)
Criando um SubShell
 Executando o exemplo anterior:
./ teste_subshell.sh
 Em outro terminal executar o comando:
ps -ef | grep teste_subshell.sh

 UID PID PPID C STIME TTY TIME CMD


 root 25357 31092 0 21:01 pts/2 00:00:00 bash teste_subshell.sh
 root 25358 25357 0 21:01 pts/2 00:00:00 bash teste_subshell.sh
Características
 Um comando externo executado em um script gera um
subprocesso, enquanto um comando interno não gera qualquer
subprocesso.
 Variáveis em um subshell não são visíveis fora do bloco do subshell,
ou seja, não são acessíveis pelo processo pai.
 Exemplo:
COMANDO1
(
PATH=/home/fabio/bin
COMANDO2
exit # sai apenas do subshell
)
# o shell pai não é afetado e seu ambiente é preservado
COMANDO5
Execução Paralela
 Para executar um subshell em segundo plano basta
colocar o símbolo & após o fechamento do
parentese
 Para fazer com que o script continue sua execução
somente após o termino dos blocos que estão em
segundo plano, pode ser utilizado o comando
interno wait
Exemplo de Execução Paralela
#!/bin/bash ( while [ 1 ] ; do
echo “Processo Pai” sleep 1
echo echo “ Processo Filho 2..."
( done
while [ 1 ] ; do )&
sleep 1 ( while [ 1 ] ; do
echo "Processo Filho 1 ..." sleep 1
done echo " Processo Filho 3..."
)& done
)

O primeiro e o segundo blocos executam paralelamente em segundo plano,


enquanto o terceiro bloco executa em paralelo aos dois primeiros.
Exemplo de Execução Paralela
#!/bin/bash (
echo “Processo Pai” i=1
( while [ $i -le 5 ] ; do
i=1 sleep 2
while [ $i -le 5 ] ; do echo “Processo Filho 2 ($i)..."
sleep 1 let i=i+1
echo “Processo Filho 1 ($i)..." done
let i=i+1 )&
done wait
)& echo "Fim do script."

Para fazer com que o script continue sua execução somente após o termino dos
blocos que estão em segundo plano, pode ser utilizado o comando interno wait

Você também pode gostar