Académique Documents
Professionnel Documents
Culture Documents
Conteúdo
• Ligando e Desligando a Máquina
• Manipulando arquivos e diretórios
• Shell Scripts
• Variáveis de Environment
• Uso de Metacaracteres
• Uso de Expressões Regulares
• Manipulando processos
• Configurando o terminal
• Diretórios Principais do Sistema
• Atributos e Nomes de Arquivos
• Intercambiando Disquetes com o MS-DOS
• O Kernel
• Redirecionamento da Entrada e da Saída; Pipes
• Comunicação Serial e Paralela
• Configuração do TCP/IP
• Serviços TCP/IP
• Disparo do Xwindows e das suas aplicações
• Procedimentos de boot e o init
• Referências
O boot costuma gerar uma razoável quantidade de mensagens que aparecem no console
da máquina. Normalmente elas referem-se aos diferentes estágios do reconhecimento e
inicialização do hardware. É interessante conhecê-las, não obstante, salvo
contingências, podem ser ignoradas até que surja o prompt ou a janela de login.
$ shutdown -y -g 1 -i 5 (Solaris)
$ shutdown -h now (Linux)
Em sistemas baseados em PC, o shutdown por vezes é acionável através do ctrl-alt-
del.
• cd diretório
Copia um ou mais arquivos, trocando seu nome ou criando a cópia num outro
diretório, conforme a quantidade e o tipo dos argumentos. Se o primeiro
argumento for um diretório, faz uma cópia recursiva de toda a subárvore iniciada
nele, desde que a opção -r (recursive) tiver sido especificada.
• ln -s argumento1 argumento2
Invoca a man-page associada ao nome, ou exibe uma lista das man pages
associadas ao nome, no caso da opção -k (de key) ter sido especificada.
As man pages Unix são referências técnicas sumárias por vezes difíceis de
compreender. Elas são exibidas através do more ou de algum outro paginador
semelhante, por isso os comandos do more indicados mais adiante valem para a
leitura de man pages, e são úteis para ajudar a localizar informações dentro de
uma man page.
• more arquivo
• vi arquivo
Shell Scripts
Seqüências de comandos que se necessita repetir com grande frqüência podem ser
colocados num arquivo que, ao ser ``executado'', ocasiona o disparo de cada um dos
comandos da seqüência, na ordem indicada. Um arquivo desses é um shell script, cujo
equivalente no MS-DOS são os arquivos ``.BAT''.
Mesmo que nunca se escreva nenhum, com certa freqüência é necessário analisar shell
scripts a fim de elucidar o modo de uso de determinados comandos, ou de realizar
diagnósticos. Suponhamos por exemplo que você não se lembre como usar um comando
chamado xpatgen, mas esteja com um shell num diretório que contém scripts, que usam
entre outros o xpatgen. Basta então buscar ocorrências dele nos scripts:
$ grep xpatgen *
patgen: xpatgen -cal_bl
Com isso sabemos que o script patgen executa o xpatgen, e relembramos o modo de
executar esse comando, o que talvez já seja suficiente para a necessidade do momento.
Variáveis de Environment
Além dos parâmetros de linha de comandos como -l ou outros, pode-se também passar
parâmetros a um programa através do uso de variáveis de environment. As mais comuns
são:
Para exibir o valor de uma delas pode-se usar echo, antepondo o operador $ ao nome da
variável, por exemplo:
$ echo $TERM
Uso de Metacaracteres
O metacaracter mais utilizado provavelmente é o ``*''. Por exemplo,
$ rm *
irá remover todos os arquivos do diretório corrente. É necessário prestar atenção a dois
detalhes quando se usa metacaracteres:
1. O caracter ``.'' não tem o significado de separador entre nome e sufixo que
possui no MS-DOS, por isso ``*.*'' significa todos os arquivos em cujo nome
ocorre ao menos um ponto.
2. A expansão do metacaracter é feita pelo shell, e não pela aplicação, por isso o
comando
$ mv *.txt *.bak
não irá surtir o efeito esperado de renomear todos os arquivos que terminam com
``.txt'' para ``.bak'' (para essa operação deve-se usar o comando for).
Os shells Unix aceitam também o metacaracter ``?'', que significa qualquer caracter e
tambem intervalos, como [0-9] (qualquer dígito decimal), entre outros.
$ grep "198[0-9]" *
$ grep -i "yellow.*page" *
$ grep -i "roget\|thesaurus" *
$ egrep -i "roget|thesaurus" *
Via de regra todas as ferramentas Unix que lidam com texto, como o more, o sed, e o
vi, entre outros, aceitam expressões regulares como argumento de buscas.
Manipulando processos
Um processo é um programa em execução. Num computador que possui apenas uma
cpu, na verdade apenas um processo pode estar sendo executado em cada instante. O
que se faz é executar um processo durante uma fração fixa de segundo, congelá-lo e
passar a executar um outro, e assim por diante, criando a ilusão de simultaneidade.
$ ps
PID TTY STAT TIME COMMAND
45 v02 S 0:00 -bash
105 v02 R 0:00 ps
O ps em geral omite muitos processos a fim de exibir uma saída limpa. Através das
opções a e x (ou e no Solaris), pode-se exibir todos os processos correntes. O número
de um processo é usado, por exemplo quando é necessário interromper prematuramente
a sua execução, através do comando kill.
A finalidade primária do comando kill não é matar um processo, mas enviar um sinal
para ele. O Unix possui diversos sinais predefinidos, como SIGHUP, SIGPIPE,
SIGTERM, etc. O atendimento a um sinal entretanto é responsabilidade do processo, ou
do programador que fez o programa, e por isso a forma com que cada processo reagirá a
cada sinal poderá variar. A fim de se interromper a execução de um processo, deve-se
enviar para ele o sinal SIGKILL:
$ kill -SIGKILL 45
$ kill -9 45
As duas formas acima em geral são equivalentes (o número associado a cada sinal pode
variar com a plataforma).
O caracter ``&'' colocado ao final da linha de comandos instrui o shell para disparar o
comando em background, a fim de que se possa continuar usando o shell mesmo antes
desse comando encerrar a sua execução.
O comando nice faz com que um processo seja disparado com baixa prioridade.
$ nice gzip -9 *
O comando nohup faz com que o processo sendo disparado se torne imune ao sinal
SIGHUP. Em combinação com o &, ele permite o disparo de programas que
permanecerão em execução mesmo após o logout do usuário. Exemplos:
$ at now + 1 minute
ls
ctrl-d
O comando ls será dessa forma executado daqui a um minuto. Note que na linha
seguinte do comando at o que se escreve é na verdade um shell script, terminado com
control-d. Ao invés de digitá-lo, poder-se-ia lê-lo de um arquivo através do
redirecionamento da entrada:
$ crontab -l
40 07 * * * updatedb
0 22 5 * * pagamento
0 6,12,15,18 * * * fetch
0 0 * * 6 backup
No caso a crontab contém três comandos. O updatedb deverá ser executado todos os
dias às 7:40. O comando pagamento deverá ser executado às 22:00 do dia 5 de cada
mês, e o backup será executado à zero hora de cada sábado.
Configurando o terminal
O terminal pode ser um terminal no sentido estrito do termo, conectado ao computador
por uma linha serial, ou então o próprio console da máquina, ou uma aplicação como o
xterm emulando um terminal dentro do Xwindows,
$ stty erase ^H
O termo básico aplicado acima aos diretórios /bin e /lib quer significar principalmente
essenciais para o boot e operação mínima do sistema. A separação desses elementos
básicos, em contraposição aos que são deixados no /usr, deve-se a razões práticas,
principalmente para facilitar a organização de redes de máquinas compartilhando
subárvores de diretório. De fato, é comum que o diretório /usr ao invés de estar
replicado em todas as máquina da rede esteja residindo fisicamente num único disco, e
sendo compartilhado por todas as máquinas.
$ ls -l /bin/cat
-rwxr-xr-x 1 root root 16584 Dec 16 20:09 /bin/cat
A string -rwxr-xr-x representa os atributos do arquivo /bin/cat. O primeiro caracter (-)
significa que se trata de um arquivo regular, em contraposição aos diretórios (d), device
special files (c) e links simbólicos (l). Os 9 caracteres restantes informam as permissões
de leitura, escrita e execução desse arquivo relativas ao seu proprietário, ao seu grupo, e
a todos os demais. O proprietário e o grupo são informados logo à direita, e no caso são
o usuário root e o grupo root.
Note que no Unix não existem os atributos de arquivo oculto ("hidden") e do sistema
("system"), suportados no MS-DOS. Não obstante, arquivos cujo primeiro caractere é
ponto (".") normalmente são omitidos pelo ls, a não ser que se utilize a opção -a (de
"all"), conforme comentamos no início.
$ ls -l /usr/sbin/pppd
-rwsr-xr-x 1 root bin 104876 Apr 27 1998 /usr/sbin/pppd
No Unix via de regra são suportados nomes ``longos'' (até 64 ou às vezes até 256
caracteres), e o ``.'' não é um separador entre o nome do arquivo e sua extensão, mas
um caracter como os outros. Não obstante, a noção de ``sufixo'' é utilizada
informalmente para facilitar a identificação de alguns formatos de arquivos, por
exemplo:
O primeiro comando irá criar o archive /tmp/etc.tar, composto por toda a subárvore
/etc. O segundo exibirá o conteúdo desse archive. O terceiro irá extrair todo o seu
conteúdo dentro do diretório /tmp, ou seja, recriará aquela mesma subárvore como
uma subárvore do diretório /tmp.
Intercambiando Disquetes com o MS-DOS
Via de regra as plataformas Unix-like oferecem ferramentas para lidar com disquetes
``formatados'' no MS-DOS (ou, mais precisamente, disquetes que usam FAT). Um set
de ferramentas bastante popular é o mtools, que oferece clones das ferramentas do
MS-DOS. Exemplos de uso:
$ mformat a:
$ mcopy a:relat.txt .
$ mdir a:
Versões recentes dessas ferramentas lidam também com o VFAT do Windows 95, que
permite nomes de arquivos ``longos''.
O intercâmbio de arquivos texto entre Unix e MS-DOS deve ser feito com cuidado. Por
herança das antigas impressoras, o fim-de-linha no MS_DOS é codificado através de
dois caracteres (CR e LF), enquanto no Unix há apenas um (o LF), além do que o
final do arquivo é sinalizado no MS-DOS por um CTRL-Z. O mcopy possui a opção -t
para realizar essas conversões quando copia de ou para disquetes.
O Kernel
O Kernel do Unix (e de virtualmente qualquer outro sistema operacional) possui um
papel de que convém ter noções, a fim de se poder compreender melhor o
funcionamento do sistema, realizar diagnósticos e procedimentos administrativos como
adição de componentes de hardware. Algum conhecimento do papel do kernel é
importante também para se ter uma noção mais clara do uso de arquivos especiais e do
diretório /proc.
É por isso que a adição de hardware novo a uma máquina pode requerer a substituição
ou ao menos a reconfiguração do kernel. Os kernels mais recentes do Linux oferecem
vários mecanismos de configuração que os tornam sobremaneira flexíveis, a ponto de
ser rara a necessidade de substituição do kernel. Os dois mecanismos fundamentais de
se configurar a operação do kernel são a passagem de parâmetros no momento do boot
(realizada pelo LILO) e a carga de módulos, feita manualmente ou por mecanismos
automáticos como o kerneld.
O diálogo entre as aplicações e o kernel realiza-se fundamentalmente através dos
system calls, que são serviços que o kernel oferece, como por exemplo read(2). Os
device special files são maneiras de se referir ao kernel os dispositivos físicos ou
lógicos com que se pretende operar, por exemplo a primeira porta serial ou a segunda
unidade de fita, ou o disco principal do sistema. Neles, o importante não é o nome, mas
sim os números de dispositivo, ou mais precisamente o major e o minor device
numbers. Device special files são criados através do comando mknod, ou através de
interfaces mais amigáveis, como o comando MAKEDEV.
para imprimir a saída de um comando. Essa sintaxe foi herdada do Unix daí a
semelhança:
$ ls -l >/dev/lp1
$ rm /bin/ls 2>/tmp/error
O ``2'' deve-se a que, internamente, a saída de erros corresponde ao descritor 2 (o 0 é
a entrada padrão e o 1 é a saída padrão).
$ wc </tmp/error
Os shells Unix oferecem um recurso para a ligação da saída padrão de um processo
com a entrada padrão de outro, chamado pipe:
$ ls|wc
No exemplo a saída do ls está sendo usada como entrada do wc. Note que o shell
dispara os dois processos ao mesmo tempo. Se o primeiro estiver produzindo saída
numa taxa superior à que o segundo lê, o sistema operacional paralizará o primeiro
sempre que o buffer que armazena o tráfego estiver cheio. Isso significa, por exemplo,
que um pipe pode ser usado mesmo quando o volume total da saída do primeiro
processo é extraordinariamente grande, por exemplo quando se tenta localizar
informações de arquivos deletados através de um dump de todos os setores do disco.
a) Adição de um terminal
Em PCs, os conectores externos das portas seriais são conectores DB-9 ou DB-25
macho, e os das paralelas são DB-25 fêmea.
Configuração do TCP/IP
Numa rede TCP/IP, a cada máquina está associado um número IP, que é um inteiro de
32 bits, normalmente escrito na forma de octetos, como 192.168.0.5. A cada máquina
está associado um nome, como por exemplo marte ou pimenta.
$ ifconfig -a
irá listar todas as interfaces com informações de cada uma. A interface ethernet
costuma chamar-se le0 (Solaris) ou eth0 (Linux). Além do ethernet, é comum usar-se
portas seriais para criar interfaces TCP/IP, principalmente para criar links com linhas
telefônicas. As placas ethernet costuma oferecer dois ou mais tipos de conectores. Ela
pode ou não descobrir automaticamente qual está em uso. Em caso negativo, você
deverá informá-la, o que habitualmente é feito através de um software de configuração
que acompanha a placa.
O passo seguinte é a configuração das rotas. Através delas a máquina sabe por onde
enviar datagramas a fim de que eles cheguem em seus destinos. Equivale de certa
forma à sinalização do tráfego urbano, com placas indicativas da direção a tomar para
atingir cada destino (Ponte do Limão à esquerda, ou Avenida Bandeirantes em frente,
etc).
Cada rota envolve um destino, uma máscara, um gateway e uma interface. Pode-se
exibir todas elas através do comando netstat:
$ netstat -r
Destination Gateway Genmask Iface
192.168.1.0 * 255.255.255.0 eth0
127.0.0.0 * 255.0.0.0 lo
default 192.168.1.1 0.0.0.0 eth0
Se o destino agora for 200.136.35.65, as duas primeiras rotas não nos servirão
(experimente aplicar o e como no caso anterior). Portanto será usada a rota default, e
como ela especifica um gateway, a comunicação terá que ser feita através dele. Assim,
toda vez que se pretender enviar alguma informação para o 200.136.35.65, esta será
enviada antes para o gateway 192.168.1.1, na esperança de que este consiga roteá-la
para o seu destino.
Serviços TCP/IP
Atualmente é comum as pessoas confundirem Internet com a teia mundial WWW,
entretanto muito antes de surgir a teia, a Internet já usava um sem-número de serviços
construídos a partir dos protocolos de transporte TCP e UDP.
Um circuito TCP entre duas máquinas equivale a um pipe duplo entre dois processos,
cada um rodando em uma das máquinas. O telnet é um típico serviço que se utiliza
desse recurso, a fim de criar sessões remotas. Pode-se exibir todas os circuitos TCP
ativos através do comando netstat:
$ netstat -t
O FTP, por sua vez, cria dois circuitos, utilizando um para envio de comandos e outro
de dados. Através do uso de alguns comandos simples, permite transferir arquivos de
ou para uma máquina remota. Os principais comandos do FTP são:
Quando for necessário disparar o X manualmente, via de regra haverá dois ou três
scripts já preparados para isso, como o startx ou o openwin. O que eles fazem
basicamente é definir uma série de parâmetros e executar o xinit, que por sua vez
dispara o Xserver e o Window Manager.
Assim, é natural que no disparo de cada aplicação seja necessário especificar qual é o
server a ser utilizado. Isso normalmente se faz através da opção de linha de comando
-display, ou através da variável de environment DISPLAY.
$ xterm -display 192.168.0.1:0.0
$ DISPLAY=192.168.0.1:0.0; export DISPLAY; xterm
Quando o Xserver está rodando numa máquina Unix, a permissão para um cliente usá-
lo é dada através do comando xhost:
Ao longo dos anos foram sendo criados inúmeros Window Managers diferentes para o
Xwindows. Algumas vezes além do window manager foram criadas também complexas
bibliotecas oferecendo serviços de alto nível que além de simplificar o trabalho de
programação tamém permitem estandardizar o aspecto visual e os recursos das janelas
das aplicações. Um dos produtos mais conhecidos dessa linha é o Motif. O advento do
Free Software criou outras opções, sendo as mais em voga atualmente o GTK e o QT,
que são utilizados respectivamente pelo GNOME e pelo KDE.
O inittab não é um script como o AUTOEXEC.BAT, mas uma lista de ações, algumas
delas de valor permanente para todo o curso da operação do sistema. Cada linha
válida representa um processo que o init deve disparar. O termo respawn significa que,
além de disparar, o init deverá monitorar o processo e, se porventura ao longo da
operação do sistema ele for encerrado, o init deverá redispará-lo.
Referências
Virtualmente qualquer informação técnica sobre sistemas Unix-like pode ser obtida na
Teia Mundial. Estou colocando aqui apenas um referência clássica (o Livro do Bach),
e um link para uma lista de pontos de entrada de documentação sobre Linux.
[1] Bach, M. J. The Design of the Unix Operating System, Prentice-Hall, 1986.
[2] Alguns links de Linux, inclusive para materiais em português, estão disponíveis em
http://www.ime.usp.br/~ueda/ldoc/links.html .