Este conjunto de tarefas deve ser realizado no sistema de janelas X11, o
que irá possibilitar o uso de âncoras visuais que facilitarão a
compreensão dos elementos com os quais vamos lidar.
Para trabalhar com este tipo de interface gráfica, é necessário lembrar
que existe nele o conceito de foco, como já vimos na aula anterior:
a janela que tem o foco é aquela que recebe o que se digita no
teclado. Para colocar o foco em uma determinada janela, a melhor forma é
clicar o botão esquerdo do mouse na parte central da barra superior da
janela, o que também a colocará acima de outras janelas que a estejam
cobrindo parcialmente.
Às vezes pode ser necessário também movimentar uma janela para que ela
fique mais visível. Para fazer isto, basta clicar e segurar o botão
esquerdo do mouse sobre a parte central da barra superior da janela e
movimentar o mouse, que carregará a janela consigo. A nova posição da
janela será aquela na qual o botão do mouse for solto. Neste momento ela
terá também o foco, ou seja, estará recebendo o input do teclado.
- Faça um login no sistema, usando o sistema de janelas X11. Caso o
computador esteja com o Linux rodando mas a bandeira de login do sistema
X11 não esteja visível, digite [Ctrl]-[Alt]-F7. Isto o levará de
qualquer dos consoles virtuais para o sétimo, onde em geral estará
rodando o sistema X11.
- Quando você entrar, será aberto para você um terminal xterm,
que aparecerá como uma janela em algum lugar da tela. Esta janela tem um
papel especial em sua seção, se ela for eliminada toda a seção terminará
e o X11 será reciclado, aparecendo novamente a bandeira de login. Para
evitar que você termine sua seção acidentalmente, vamos evitar usar esta
janela por enquanto.
Abra duas outras janelas xterm para uso nestas tarefas. Para fazer
isto, clique e segure o botão esquerdo do mouse sobre o fundo da tela.
Aparecerá um menu, o primeiro ítem do qual abre um novo terminal. Leve o
cursor do mouse para cima deste primeiro ítem e solte o botão da
esquerda, o que causará o aparecimento de uma nova janela de terminal.
Tendo aberto os dois novos terminais, iconize o terminal original,
clicando o botão esquerdo do mouse no botão que contem um pequeno
quadradinho, o penúltimo à direita na barra superior da janela. Organize
os dois novos terminais na tela, mudando suas posições, até que se tenha
boa visibilidade de ambas as janelas e que seja possível passar o foco
facilmente de uma para a outra.
- Execute, em uma das duas janelas, o comando ps. Você consegue
reconhecer cada um dos processos que estão rodando e identificar a que
janelas cada um está associado?
- Execute, na outra janela, o comando xclock. Vai aparecer em
sua tela um relógio. Observe que o terminal fica ``preso'', não responde
mais ao seu input no teclado, não mostra mais o prompt quando você aperta
a tecla [Enter]. Olhe os processos de novo, no outro terminal.
- Coloque o foco no terminal onde você está rodando o relógio e
digite [Ctrl]-C. Isto significa segurar a tecla [Ctrl]
(control) enquanto você digita uma vez a tecla da letra C (ou c). Apesar de que em geral indicamos este tipo de coisa usando letras
maiúsculas, não se deve apertar a tecla [Shift]. Caso isto seja
necessário estará indicado explicitamente. Observe o que acontece com o
relógio. Verifique a situação dos processos no outro terminal.
- Execute mais uma vez, na mesma janela que usou antes, o comando
xclock. Para desconectar o seu terminal do processo que foi
iniciado, digite a combinação [Ctrl]-Z. Trata-se de um caracter de
controle que faz com que um sinal seja enviado pela shell ao processo,
provocando a sua suspensão temporária. Observe que você ganha de volta o
acesso de input à janela. Verifique a situação dos processos no outro
terminal.
- Voltando ao terminal onde está rodando o xclock, execute o
comando jobs. Ele irá mostrar todos os processos que estão sendo
administrados pela shell que está rodando neste terminal. Examine o
output do comando e veja se dá para entender o que aparece lá.
- É possível rodar um programa de forma que ele já se inicie sem
conexão com o terminal. Para fazer isto, na mesma janela que está usando
para rodar o primeiro relógio, rode um segundo relógio usando o comando
xclock &. Observe que desta vez o seu terminal ficou livre para
outras tarefas.
- Execute de novo o comando jobs e examine o resultado.
Verifique a situação dos processos no outro terminal. Observe os dois
relógios durante alguns minutos e verifique o que acontece com eles.
Você sabe porquê os dois se comportam de forma diferente?
- Para por para rodar de fato o job que está suspenso no background,
como indicado no output do comando jobs, basta executar o comando
bg %<número-do-job>. O número do job é o que aparece entre chaves
no output do comando jobs. Execute de novo este comando, examine o
resultado e verifique a situação dos processos no outro terminal. Espere
mais alguns minutos e verifique como se comportam os relógios agora.
Um processo estar no ``background'' significa que ele está rodando sob a
administração da shell, sem, entretanto, que o sistema de input da sua
sessão esteja ligado permanentemente a ele. Dizemos que um processo que
esteja sendo rodado pela shell e que esteja ligado ao input do teclado
está rodando no ``foreground''.
- Execute o comando jobs -l, que irá listar os números de
identificação (PID) dos processos associados a cada um dos jobs. No outro
terminal, olhe os processos com o comando ps, identificando aquele
que corresponde ao primeiro job. Em seguida, elimine este processo usando
o comando kill <número-do-processo>. O número do processo aparece
tanto no output do comando jobs -l quanto no do comando ps. O
que acontece com o relógio? Olhe de novo os processos e execute de novo o
comando jobs no outro terminal.
- Observe que, ao contrário do comando ps, o comando jobs
dá resultados que são específicos da shell sob a qual está rodando. O
comando jobs não é um programa como o comando ps, que está
num arquivo que a shell lê e roda. Ele é o que chamamos de um ``comando
intrínseco'' da shell, ou um ``shell built-in'', um comando interno do
programa que chamamos de ``shell''. Em cada tipo de shell existe um
número relativamente pequeno de comandos deste tipo. Execute o comando
jobs em ambos os terminais e verifique a diferença nos outputs de
cada um.
- Para reconectar um job ao seu terminal, você executa o comando fg %<número-do-job>. Faça isto com o segundo relógio. Observe que o seu
terminal ficou preso de novo. Você pode colocar ele no background de novo
digitando [Ctrl]-Z. Para reconectar o job mais uma vez ao seu
terminal, basta dar agora o comando fg sem argumento. Havendo
apenas um job, todos os comandos de controle de jobs vão se aplicar a ele
de forma automática. Elimine o segundo relógio usando [Ctrl]-C ou o
comando kill.
- Num dos dois terminais que você abriu, rode o comando ps com
as opções a, u e x, ou seja, use o comando da forma
ps aux. O comando ps tem a peculiaridade de não exigir (na
verdade, de não querer) os sinais de - antes das opções. Se você os
colocar, ele entende o input e executa corretamente, mas dá um aviso de
``deprecated'', o que significa que um dia ele vai parar de aceitar esta
forma de se colocar as opções. Em geral, com ou sem os sinais de -,
quando um comando é submetido com várias opções, você pode juntar as
opções, ou seja, em nosso caso ps aux é equivalente a ps a u
x.
Esta forma do comando vai colocar na tela uma lista de todos os processos
que estão rodando no sistema. A opção a significa ``all'', ou seja,
não apenas os seus processos, mas também os de outros usuários. A opção
u faz com que o comando mostre o usuário ao qual pertence cada
processo. A opção x inclui na lista os processos que não estejam
conectados a um terminal. Caso você queira descobrir mais sobre este
comando, olhe a sua página do manual, executando man ps.
Provavelmente você vai descobrir que a lista que aparece não cabe toda no
seu terminal. Em geral há um número considerável de processos rodando em
qualquer sistema, mesmo quando ele não está fazendo nada particularmente
notável. A maior parte destes processos é do usuário root, o que indica
que se trata de processos internos do sistema ou de serviços mantidos
pelo sistema, que não pertencem a nenhum usuário em particular.
- Para poder olhar toda a lista de processos de uma forma controlada,
vamos agora usar o conceito de pipeline de comandos, que é um dos
conceitos importantes do sistema. Desta forma, redirecionamos o output do
comando ps aux, que é uma lista um tanto longa, para o input de um
outro programa, um paginador como o programa more, que nos permita
olhar uma página de cada vez. Faça isto, executando a pipeline ps
aux | more, passando de cada página para a seguinte com a barra de
espaço do teclado, ou indo de linha em linha com a tecla [Enter].
- O comando more também pode ser usado diretamente para paginar
um arquivo qualquer. Use-o da forma more /etc/passwd para verificar
este fato. Tente também ypcat passwd | more, caso o seu sistema
esteja rodando o sub-sistema NIS (Network Information Service, vamos ver
isto mais tarde). Alguns comandos e programas já paginam o seu output de
forma automática como, por exemplo, o comando man. Execute o
comando man more para verificar este fato.
O comando man não tem um código de paginação interno. Em vez disso,
ele está fazendo, internamente, uma pipeline e usando um programa de
paginação. Note como, desta forma, economiza-se muita repetição de
programação no sistema. Podemos ter dois ou três programas diferentes de
paginação, mas não é necessário repetir todo o código de paginação em
cada programa que necessitar deste tipo de ação sobre os dados de saída.
- O comando ps nos permite olhar os processos do sistema num
determinado momento. Há também uma utilidade, chamada top, que nos
permite monitorar os processos de forma mais detalhada, pois ele fica
rodando, atualizando o seu output a intervalos regulares, mostrando os
processos em ordem decrescente de tempo de CPU utilizado por cada um. Ou
seja, ele nos mostra os processos mais ativos do sistema por ordem
decrescente de atividade. Desta forma, ele nos dá uma boa idéia de como
está a carga de processos no sistema. Execute este aplicativo em um dos
dois terminais que você abriu, digitando top. Observe durante algum
tempo o output que aparece na tela.
- No outro terminal, vamos rodar um programa que vai consumir uma
grande quantidade de tempo de CPU, para ver o que acontece no output do
comando top. Execute no outro terminal o comando cat /dev/zero
> /dev/null. Como o arquivo /dev/zero não é de fato um arquivo
comum e sim uma conexão com o gerador de zeros binários do kernel, este
comando vai usar muito tempo de CPU. O resultado de toda esta atividade é
uma grande quantidade de zeros, que vão ser descartados, pois o output
está re-direcionado para /dev/null.
Não se recomenda rodar algo assim durante a operação normal do sistema,
pois trata-se de um exemplo paradigmático de atividade 100 %
ineficiente, que vai consumir grande quantidades de recursos do sistema
com absolutamente nenhum resultado. Observe o output do comando top
que está rodando no outro terminal durante algum tempo. Depois disto,
interrompa o processo que você está rodando neste terminal, digitando
[Ctrl]-C. Volte a observar mais um pouco o output na outra janela.
- Termine o comando top digitando a letra q no terminal
onde ele está rodando. O comando top também pode ser rodado num
terminal comum, fora do sistema de janelas X11. Para fazer isto, é
necessário que você faça um novo login no sistema, em um dos consoles de
caracteres. Ao fazer isto, não saia da sua seção X11, você vai passar a
ter duas seções independentes no sistema, uma no X11 e outra num console
de caracteres.
Para fazer isto, digite [Ctrl]-[Alt]-F1, o que o levará para o
primeiro console virtual, que é o terminal tty1 do sistema. Faça um
login neste terminal. Este console é agora um novo terminal de acesso ao
sistema, onde está rodando mais uma shell pertencente a você. Rode o
comando top neste terminal. Verifique que ele funciona exatamente
como você já viu antes ao rodá-lo dentro do sistema de janelas X11.
- Deixe o top rodando no primeiro console e volte ao sistema
X11, digitando [Alt]-F7 (ou [Ctrl]-[Alt]-F7, tanto faz,
quando você está executando isto fora do sistema X11). Execute o comando
ps dentro de uma das duas janelas de terminal que ainda estão
lá. Você consegue identificar os processos que se referem à sua outra
seção? Mate o processo do comando top com o comando kill e
volte ao primeiro console para verificar o que aconteceu. Termine sua
seção no console executando o comando exit. Observe a bandeira de
login do terminal de caracteres voltar a aparecer e depois volte ao X11.
- Existe outra forma de se executar um processo, que às vezes é útil.
Trata-se do uso do comando exec, que é outro ``built-in'' da shell.
Para usar este comando, basta executar exec <programa>. Quando
executamos programas usando este comando, a shell comete um tipo de
suicídio: em vez de rodar o programa como um novo processo, ela roda o
programa em lugar dela mesma e morre. Para testar isto, execute o comando
exec top em um dos dois terminais que você tem no sistema X11. Em
seguida, digite neste mesmo terminal a letra q para terminar o top
e veja o que acontece.
- Isto sugere que qualquer programa que rode num terminal de
caracteres pode ser rodado dentro do sistema X11 através do uso de um
terminal e de uma operação do tipo que é realizada pelo comando exec. De fato, o comando xterm tem uma opção que permite
exatamente este tipo de uso.
Normalmente, quando se executa o xterm, uma shell é iniciada dentro
dele, para que o terminal possa ser usado para a interação com o sistema.
Verifique isto executando o comando xterm &. Você agora voltou a
ter duas janelas de terminal disponíveis. Execute agora o comando xterm -e top &, em qualquer das duas janelas de terminal. A opção -e <programa> troca a shell pelo programa discriminado. Verifique que
aparece mais uma janela de terminal rodando o top dentro. Digite q
nesta nova janela e veja o que acontece.
- Você acaba de fabricar um aplicativo X11 a partir de um aplicativo
para terminais de caracteres, que poderíamos até chamar de xtop!
Com isto, podemos associar a um botão do sistema de janelas qualquer
comando, mesmo que ele rode apenas em terminais de caracteres.
- Saia da sua seção X11. Para isto, de-iconize a janela de terminal
que apareceu originalmente quando você entrou. Dependendo de como estiver
configurado o sistema de gerenciamento de janelas você estiver usando, o
ícone que representa aquela janela pode estar dentro de uma caixa, um
gerenciador de ícones, ou em qualquer lugar da tela. Nestas notas
estaremos assumindo que você está usando o gerenciador fvwm,
configurado de uma certa forma padronizada.
Caso o gerenciador de ícones esteja sendo usado, basta clicar uma vez o
botão esquerdo do mouse em cima do botão que representa a janela. Caso
contrário, basta dar um double-click, ou seja, clicar rapidamente duas
vezes com o botão esquerdo do mouse, em cima do ícone que representa a
janela, o qual pode estar em qualquer lugar da tela.
Uma vez aberta a janela, execute o comando exit nela para terminar
a sua seção. Sempre que abandonar um terminal, verifique que você fechou
todas as seções que tiver iniciado nele, tanto no X11 quando nos consoles
de caracteres, caso contrário sua conta estará aberta e sem proteção, à
mercê de qualquer um que tenha acesso ao terminal.