Guia para dominar comandos avançados do Linux, Parte 4: Administrando o ambiente Linux


Arup Nanda Oracle ACE Director

Publicado em maio de 2009

Nesta parte do guia, você aprenderá como administrar o ambiente Linux de modo eficaz com os comandos usados com maior frequência.


ifconfig

O comando ifconfig mostra os detalhes da(s) interface(s) de rede definida(s) no sistema. A opção mais comum é -a, que mostra todas as interfaces.

# ifconfig -a

O nome normalmente usado para a interface de rede Ethernet é eth0. Para encontrar os detalhes de uma interface específica, por exemplo, eth0, você pode usar:

# ifconfig eth0


Apresentamos o resultado a seguir com a explicação:

 

Figure1

Vejamos algumas partes fundamentais do resultado:

  • Link encap: o tipo de hardware físico compatível com esta interface (Ethernet, no caso).
  • HWaddr: o identificador exclusivo da placa NIC. Toda placa NIC tem um identificador exclusivo atribuído pelo fabricante, chamado MAC ou endereço MAC. O endereço IP é anexado ao MAC no servidor. Se esse endereço for alterado ou a placa for transferida para outro servidor, o identificador MAC não será alterado.
  • Mask: a máscara de rede.
  • inet addr: o endereço IP anexado à interface.
  • RX packets: o número de pacotes recebidos por esta interface.
  • TX packets: o número de pacotes enviados.
  • errors: o número de erros no envio ou recebimento.

O comando não é usado somente para verificar as configurações; ele é usado também para configurar e administrar a interface. Veja a seguir uma breve lista de parâmetros e opções para este comando:

up/downativa ou desativa uma interface específica. Você pode usar o parâmetro down para desligar
uma interface (ou desativá-la):

# ifconfig eth0 down


Do mesmo modo, para ligá-la (ou ativá-la), use:

# ifconfig eth0 up


media
define o tipo de mídia Ethernet, como 10baseT, 10 Base 2 etc. Os valores comuns para o parâmetro ‘media’ são: 10base2, 10baseT e AUI. Se quiser que Linux detecte o tipo de mídia automaticamente, especifique a opção “auto”, como mostramos a seguir:

# ifconfig eth0 media auto


add
define um endereço IP específico para a interface. Se você quisesse definir o endereço IP como 192.168.1.101 para a interface eth0, emitiria o seguinte comando:

# ifconfig eth0 add  192.168.1.101


netmask
define o parâmetro de máscara de rede da interface. Veja um exemplo de como definir a máscara de rede da interface eth0 como 255.255.255.0

# ifconfig eth0 netmask  255.255.255.0


Em um ambiente Oracle RAC (Real Application Clusters), é preciso definir a máscara de rede de determinada maneira com esse comando.

Em algumas configurações avançadas, é possível alterar o endereço MAC atribuído para a interface de rede. O parâmetro hw realiza a alteração. O formato geral é:

ifconfig                               
<Interface>
hw
<TypeOfInterface> <MAC>

O parâmetro <TypeOfInterface> mostra o tipo de interface, por exemplo, ether, no caso de Ethernet. Veja como o endereço MAC atribuído à interface eth0 é alterado para 12.34.56.78.90.12 (Observação: o endereço MAC apresentado aqui é fictício. Se corresponder a algum MAC real, será mera coincidência):

# ifconfig eth0 hw ether  12.34.56.78.90.12

Esse procedimento será útil, caso você adicione uma nova placa (com um novo endereço MAC), mas não deseja alterar a configuração relacionada ao Linux, como as interfaces de rede.

Aplicação para os usuários Oracle

Este, bem como o nestat descrito a seguir, é um dos comandos mais utilizados para administrar o Oracle RAC. O desempenho do Oracle RAC depende muito da interconexão usada entre os nós do cluster. Se estiver saturada (ou seja, não suporta mais nenhum tráfego adicional) ou falhando, o desempenho será reduzido. A melhor ação neste caso é examinar o resultado da instrução ifconfig para verificar eventuais falhas. Veja um exemplo típico:

# ifconfig eth9
eth9    Link encap:Ethernet   HWaddr 00:1C:23:CE:6F:82  
        inet addr:10.14.104.31   Bcast:10.14.104.255   Mask:255.255.255.0
        inet6 addr: fe80::21c:23ff:fece:6f82/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST   MTU:1500  Metric:1
        RX packets:1204285416 errors:0 dropped:560923 overruns:0 frame:0
        TX packets:587443664 errors:0 dropped:623409 overruns:0 carrier:0
        collisions:0 txqueuelen:1000 
        RX bytes:1670104239570 (1.5 TiB)  TX bytes:42726010594 (39.7 GiB)
        Interrupt:169 Memory:f8000000-f8012100
                            

Observe o texto realçado em vermelho. A contagem de pacotes perdidos é extremamente alta; o número ideal é 0 ou aproximadamente isso. Um número elevado, acima de meio milhão, indica que um defeito na interconexão derruba os pacotes, provocando reenvio destes — uma boa pista para o diagnóstico de problemas.

netstat

Para avaliar o status de entrada e saída através da interface de rede, use o comando netstat, que pode fornecer as informações completas sobre o desempenho da interface de rede, chegando até o nível de soquete. Veja este exemplo:

# netstat
Active Internet connections  (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address  State      
tcp     0      0    prolin1:31027 prolin1:5500    TIME_WAIT 
tcp     4      0    prolin1l:1521 applin1:40205   ESTABLISHED 
tcp     0      0    prolin1l:1522 prolin1:39957   ESTABLISHED 
tcp     0      0    prolin1l:3938 prolin1:31017   TIME_WAIT
tcp     0      0    prolin1l:1521 prolin1:21545   ESTABLISHED
                               
… and so on …

O resultado acima continua para mostrar todos os soquetes abertos. Em termos bastante simples, um soquete está relacionado a uma conexão entre os dois processos. [Observação importante: no sentido exato, “soquetes” e “conexões” são tecnicamente diferentes. Um soquete pode existir sem uma conexão. No entanto, uma discussão sobre soquetes e conexões estaria além do escopo deste artigo. Portanto, apresentei apenas o conceito de maneira fácil de entender.] Naturalmente, uma conexão precisa de uma origem e um destino, chamados endereço local e remoto. Os pontos finais podem se situar no mesmo servidor ou em servidores diferentes.

Em muitos casos, os programas são conectados ao mesmo servidor. Por exemplo, se dois processadores se comunicarem entre si, os endereços local e remoto serão iguais, como mostra a primeira linha, tanto o endereço local quanto o remoto equivalem ao servidor “prolin1”. Entretanto, os processos se comunicam por meio de uma porta, que será diferente. Essa porta é mostrada ao lado do nome do host, após o sinal de dois-pontos (:). O programa do usuário manda os dados a serem enviados pelo soquete para uma fila e o destinatário os lê em uma fila no terminal remoto.

Veja as colunas resultantes:

  1. A coluna na extrema esquerda “ Proto” mostra o tipo de conexão – tcp neste caso. A coluna Recv-Q mostra os bytes de dados na fila a serem enviados para o programa do usuário que estabeleceu a conexão. Esse valor deve ser o mais próximo de zero possível. Em servidores muito ocupados, esse valor será superior a zero, mas não deverá ser muito alto. Um número mais alto pode não significar muita coisa, a não ser que apareça um número maior na coluna Send-Q, descrita a seguir.

  2. A coluna Send-Q indica os bytes na fila a serem enviados para o programa remoto, ou seja, bytes cujo recebimento ainda não foi acusado pelo programa remoto. Esse valor deve ficar perto de zero. Um número maior pode indicar um gargalo na rede.

  3. Local Address é a origem da conexão e o número da porta do programa.

  4. Foreign Address é o host de destino e o número da porta. Na primeira linha, a origem e o destino estão no mesmo host: prolin1. A conexão está simplesmente em espera. A segunda linha mostra a conexão estabelecida entre a porta 1521 de proiln1 indo para a porta 40205 de applin1 do host. É mais provável que uma conexão Oracle vá do applin1 do cliente para o prolin1 do servidor de banco de dados. Como o detector Oracle em prolin1 é executado na porta 1521, esta é a porta de origem. Nessa conexão, o servidor envia os dados solicitados para o cliente.

  5. A coluna State mostra o status da conexão. Seguem alguns valores comuns.

    • ESTABLISHED
      – a conexão foi estabelecida. Isso não significa que os dados estão fluindo entre origem e destino, simplesmente indica que “eles se comunicam”.
    • CLOSED – a conexão foi fechada, ou seja, não está em uso agora.
    • TIME_WAIT – a conexão está sendo fechada, mas ainda há pacotes em processamento na rede.
    • CLOSE_WAIT – a extremidade remota foi desligada e pediu o fechamento da conexão.


Bem, com base nos endereços local e externo, especialmente números de porta, você pode imaginar que as conexões têm relação com o BD Oracle, mas seria bom ter certeza disso, correto? Sem dúvida.
A opção -p mostra também as informações dos processos:

#  netstat -p
Proto Recv-Q Send-Q Local Address Foreign Address State    PID/Program name   
tcp     0     0     prolin1:1521 prolin1:33303 ESTABLISHED 1327/oraclePROPRD1  
tcp     0     0     prolin1:1521 applin1:51324 ESTABLISHED 13827/oraclePROPRD1 
tcp     0     0     prolin1:1521 prolin1:33298 ESTABLISHED 32695/tnslsnr       
tcp     0     0     prolin1:1521 prolin1:32544 ESTABLISHED 15251/oracle+ASM    
tcp     0     0     prolin1:1521 prolin1:33331 ESTABLISHED 32695/tnslsnr    


Assim, a última coluna apresenta claramente o processo de IP e o respectivo nome, confirmando que se trata dos seguintes processos: de servidor Oracle, de detector e de servidor de ASM.

O comando netstat pode ter várias opções e parâmetros. Vejamos alguns dos principais:

Para descobrir as estatísticas de rede referentes às diferentes interfaces, use a opção -i.

#  netstat -i
Kernel  Interface table
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR  TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0   1500  0  6860659   0      0      0   2055833   0      0      0   BMRU
eth8   1500  0     2345   0      0      0       833   0      0      0   BMRU
lo    16436  0 14449079   0      0      0  14449079   0      0      0    LRU


Isso mostra as diferentes interfaces presentes no servidor (eth0, eth8 etc.) e os indicadores associados a cada uma delas.

  • RX-OK mostra o número de pacotes enviados com êxito (com relação a esta interface)
  • RX-ERR mostra o número de erros
  • RX-DRP mostra pacotes derrubados e que precisam ser reenviados (com ou sem êxito)
  • RX-OVR mostra pacotes excedentes

Os próximos conjuntos de colunas (TX-OK, TX-ERR etc.) mostram as estatísticas correspondentes para envio de dados. A coluna Flg consiste em um valor composto da propriedade da interface.  Cada letra indica a presença de uma propriedade específica. Segue uma explicação das letras.

B – Broadcast (transmissão)
M – Multicast (transmissão múltipla)
R – Running (em execução)
U – Up (ativo)
O – ARP Off ( address resolution protocol, protocolo de conversão de endereços desativado)
P – Point to Point Connection (conexão ponto a ponto)
L – Loopback (canal de comunicação com apenas um ponto final)
m – Master (mestre)
s – Slave (escravo)

Você pode usar a opção --interface (observação: são dois hífens, não um) para exibir as mesmas informações referentes a uma determinada interface.

# netstat --interface=eth0 
Kernel Interface table
Iface MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500  0 277903459   0      0      0   170897632   0      0      0  BMsRU


Obviamente, o resultado será extenso e um pouco difícil de entender de imediato. Se estiver comparando diferentes interfaces, é melhor usar um resultado tabular. Se quiser examinar os valores num formato mais legível, use a opção -e para obter um esultado expandido:

# netstat -i -e
Kernel Interface table
eth0      Link encap:Ethernet   HWaddr 00:13:72:CC:EB:00  
          inet addr:10.14.106.0   Bcast:10.14.107.255   Mask:255.255.252.0
          inet6 addr: fe80::213:72ff:fecc:eb00/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6861068 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2055956 errors:0 dropped:0 overruns:0  carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3574788558 (3.3 GiB)  TX bytes:401608995 (383.0 MiB)
          Interrupt:169


Esse resultado lhe parece familiar? Deveria, pois é o mesmo obtido com o comando ifconfig.

Se preferir que o resultado mostre endereços IP em vez de nomes de host, use a opção -n.

A opção -s mostra um resumo estatístico de cada protocolo em vez de apresentar os detalhes de cada conexão. Você pode combiná-la com o indicador específico do protocolo. Por exemplo, a opção -u mostra as estatísticas relacionadas ao protocolo UDP.

# netstat -s -u
Udp:
    12764104 packets received
    600849 packets to unknown port received.
    0 packet receive errors
    13455783 packets sent


Do mesmo modo, para ver as estatísticas referentes ao tcp, use a opção -t e, para obter os dados brutos, use -r.

Uma opção realmente útil é exibir a tabela de roteamento. Para tanto, use a opção -r.

#  netstat -r
Kernel  IP routing table
Destination    Gateway       Genmask          Flags  MSS Window  irtt Iface
10.20.191.0    *             255.255.255.128  U        0 0          0 bond0
172.22.13.0    *             255.255.255.0    U        0 0          0 eth9
169.254.0.0    *             255.255.0.0      U        0 0          0 eth9
default        10.20.191.1   0.0.0.0          UG       0 0          0 bond0


A segunda coluna com os resultados do comando netstat, Gateway, mostra o gateway para o qual é feito o roteamento dos pontos de entrada. Se nenhum gateway for usado, será exibido apenas um asterisco. A terceira coluna, Genmask, mostra a “generalidade” da rota, ou seja, a máscara de rede dessa rota. Quando você fornece um endereço IP para o qual pretende encontrar uma rota adequada, o kernel percorre cada entrada da tabela de roteamento, usando a lógica binária (bitwise) AND do endereço e a máscara de rede antes de compará-la ao destino da rota.

A quarta coluna, Flags, exibe os seguintes indicadores que descrevem a rota:

  • G significa que a rota usa um gateway.
  • U significa que a interface a ser usada está ‘up’ (ativa e disponível).
  • H significa que um apenas um host pode ser alcançado através da rota. Por exemplo, é o caso da entrada de loopback 127.0.0.1.
  • D significa que a rota foi criada de modo dinâmico.
  • ! significa que a rota foi rejeitada e os dados serão perdidos.


As três colunas a seguir mostram os parâmetros MSS, Window e irtt que serão aplicados às conexões TCP estabelecidas por meio dessa rota.

  • MSS corresponde a Maximum Segment Size – o tamanho do maior datagrama a ser transmitido pela rota em questão.
  • Window é o volume máximo de dados que o sistema aceitará em um único pico de um host remoto dessa rota.
  • irtt significa Initial Round Trip Time – um conceito um pouco complicado para explicar. Vejamos o que significa irtt separadamente.
O protocolo TCP conta com uma verificação de confiabilidade integrada. Se falhar durante a  transmissão, o pacote de dados será retransmitido. O protocolo acompanha o tempo que leva para os dados atingirem o destino e acusa o recebimento. Se o reconhecimento não chegar no período esperado, o pacote será retransmitido. O período que o protocolo precisa aguardar antes de retransmitir os dados é definido para a interface uma vez (mas pode ser alterado) e esse valor é conhecido como initial round trip time. O número 0 indica que o valor padrão foi aplicado. Por fim, o último campo exibe a interface de rede a ser usada pela rota.


nslookup

Cada host acessível em uma rede deve ter um endereço IP que o identifique de modo exclusivo. Na internet, que não deixa de ser uma imensa rede, os endereços IP permitem que as conexões atinjam os servidores que executam os sites, por exemplo, www.oracle.com. Então, quando um host (como um cliente) quer conectar-se a outro (como um servidor de banco de dados) usando seu nome e não o endereço IP, como o navegador do cliente sabe a qual endereço IP deve conectar-se?

O mecanismo de tradução do nome do host em endereços IP é conhecido como resolução de nomes. No nível mais rudimentar, o host tem um arquivo especial chamado hosts que armazena o endereço IP – pares de nomes do host. Veja este arquivo de exemplo:

 
# cat /etc/hosts
# Do not remove the following  line, or various programs
# that require network  functionality will fail.
127.0.0.1       localhost.localdomain       localhost
192.168.1.101   prolin1.proligence.com      prolin1
192.168.1.102   prolin2.proligence.com      prolin2


Neste exemplo, o nome do host prolin1.proligence.com é traduzido como 192.168.1.101. A entrada especial com o endereço IP 127.0.0.1 é chamada entrada de loopback e aponta-se de volta ao servidor por meio de uma interface de rede especial chamada lo (vista anteriormente nos comandos ifconfig e netstat).

Até aqui, tudo bem, mas não é possível colocar todos os endereços IP do mundo nesse arquivo. É preciso ter outro mecanismo para realizar a resolução de nomes. Um servidor especial, chamado nameserver, exerce essa função. O nameserver funciona como uma lista telefônica usada por uma operadora, não como uma agenda pessoal. Pode haver vários nameservers disponíveis dentro ou fora da rede privada. Primeiro, o host entra em contato com um dos nameservers, obtém o endereço IP do host de destino ao qual deseja conectar-se e tenta estabelecer conexão com esse endereço IP.

Como o host sabe quais são os nameservers em questão? Procurando em um arquivo especial chamado /etc/resolv.conf para obter a informação desejada. Veja uma amostra do arquivo resolv.
 

; generated by  /sbin/dhclient-script
search proligence.com
nameserver 10.14.1.58
nameserver 10.14.1.59
nameserver 10.20.223.108


Como se pode ter certeza de que a resolução de nomes está funcionando corretamente com relação a um determinado nome de host? Em outras palavras, é preciso estar certo de que quando tentar entrar em contato com um host chamado oracle.com, o sistema Linux poderá encontrar o endereço IP no ameserver. O comando nslookup é útil para esse fim. Veja como usá-lo:

# nslookup oracle.com
Server:         10.14.1.58
Address:        10.14.1.58#53
                              
Non-authoritative answer:
Name:   oracle.com
Address: 141.146.8.66
                            

Vejamos o resultado em detalhes. O resultado Server e o endereço do nameserver. O nameserver converte o nome oracle.com no endereço IP 141.146.8.66 mostrado ao lado da palavra Server no resultado. Se você colocar esse IP no campo de URL do navegador - http://141.146.8.66 em vez de http://oracle.com - chegará ao site oracle.com.

Se cometer um erro ou procurar um host incorreto:
 
# nslookup oracle-site.com
Server:         10.14.1.58
Address:        10.14.1.58#53
                              
** server can't find  oracle-site.com: NXDOMAIN
                            

A mensagem é bastante clara: esse host não existe.

dig

O comando nslookup foi desaprovado. Em seu lugar, um comando novo e mais poderoso – dig (domain information groper) – deve ser usado. Em alguns servidores Linux mais recentes o comando nslookup talvez não esteja disponível.

Vejamos um exemplo. Para verificar a resolução de nome do host oracle.com, você pode usar este comando:
 
# dig oracle.com

; <<>> DiG 9.2.4  <<>> oracle.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<-  opcode: QUERY, status: NOERROR, id: 62512
;; flags: qr rd ra; QUERY: 1,  ANSWER: 1, AUTHORITY: 8, ADDITIONAL: 8
 
;; QUESTION SECTION:
;oracle.com.                    IN      A
 
;; ANSWER SECTION:
oracle.com.             300     IN      A       141.146.8.66
 
;; AUTHORITY SECTION:
oracle.com.             3230    IN      NS      ns1.oracle.com.
oracle.com.             3230    IN      NS      ns4.oracle.com.
oracle.com.             3230    IN      NS      u-ns1.oracle.com.
oracle.com.             3230    IN      NS      u-ns2.oracle.com.
oracle.com.             3230    IN      NS      u-ns3.oracle.com.
oracle.com.             3230    IN      NS      u-ns4.oracle.com.
oracle.com.             3230    IN      NS      u-ns5.oracle.com.
oracle.com.             3230    IN      NS      u-ns6.oracle.com.
 
;; ADDITIONAL SECTION:
ns1.oracle.com.         124934  IN      A       148.87.1.20
ns4.oracle.com.         124934  IN      A       148.87.112.100
u-ns1.oracle.com.       46043   IN      A       204.74.108.1
u-ns2.oracle.com.       46043   IN      A       204.74.109.1
u-ns3.oracle.com.       46043   IN      A       199.7.68.1
u-ns4.oracle.com.       46043   IN      A       199.7.69.1
u-ns5.oracle.com.       46043   IN      A       204.74.114.1
u-ns6.oracle.com.       46043   IN      A       204.74.115.1
 
;; Query time: 97 msec
;; SERVER:  10.14.1.58#53(10.14.1.58)
;; WHEN: Mon Dec 29 22:05:56  2008
;; MSG SIZE  rcvd: 328
                            


O resultado mammoth ressalta vários aspectos. Ele mostra que o comando enviou uma consulta ao nameserver que, por sua vez, enviou uma resposta ao host. A resolução de nome também foi feita em outros nameservers, como ns1.oracle.com. Mostra também que a execução da consulta levou 97 milésimos de segundo.

Se o tamanho do resultado torná-lo impraticável, você poderá usar a opção +short para remover todas as respostas prolixas:

# dig +short oracle.com
141.146.8.66


Também poderá usar o endereço IP para reverter a pesquisa de nome do host do endereço IP.  A opção -x é usada para esse fim.

# dig -x 141.146.8.66


O parâmetro +domain é útil quando procuramos um host em um domínio. Por exemplo, se estiver procurando o host otn no domínio oracle.com. você poderá usar:

# dig +short otn.oracle.com


ou o parâmetro +domain:

# dig +short +tcp  +domain=oracle.com otn
www.oracle.com.
www.oraclegha.com.
141.146.8.66

 

Aplicação para os usuários Oracle

A conectividade é estabelecida entre os servidores de aplicativos e de banco de dados. O arquivo TNSNAMES.ORA, usado pela instrução SQL*Net, pode ficar parecido com o seguinte:

prodb3 =
  (description =
    (address_list =
      (address = (protocol = tcp)(host = prolin3)(port = 1521))
    )
    (connect_data =
      (sid = prodb3)
    )
  )


O servidor de aplicativos conseguirá converter o nome do host prolin3, que provavelmente estará no arquivo /etc/hosts, ou o host prolin3 deverá ser definido no DNS. Para certificar-se de que a resolução de nome funciona corretamente e aponta para o host correto, use o comando dig.

Com esses dois comandos, você pode realizar a maioria das tarefas de rede em um ambiente Linux. No restante destas orientações, ensinaremos como administrar um ambiente Linux com eficácia.

uptime

Você acabou de efetuar login no servidor e percebe que algumas coisas que deveriam estar funcionando não estão. Talvez esses processos tenham sido eliminados ou todos foram desativados por um desligamento. Em vez de tentar adivinhar, descubra se o servidor foi realmente reiniciado com o comando uptime, que mostra o período em que o servidor está ativo desde a última reinicialização.

# uptime
 16:43:43 up 672 days, 17:46,   45 users,  load average: 4.45,  5.18, 5.38


O resultado mostra várias informações úteis. A primeira coluna mostra o horário em que o comando foi executado. A segunda parte – até 672 dias, 17:46 – mostra por quanto tempo o servidor ficou ativo. Os números 17:46 indicam as horas e os minutos. Portanto, o servidor em questão está ligado há 672 dias, 17 horas e 46 minutos.

O próximo item – 45 usuários – mostra quantos usuários estão conectados ao servidor no momento.

A última parte do resultado mostra qual a carga média do servidor nos últimos 1, 5 e 15 minutos, respectivamente. O termo “carga média” é uma pontuação composta que determina a carga no sistema com base nos indicadores da CPU e de I/O (entrada e saída). Quanto maior a média, maior a carga no sistema. A média não é baseada em uma escala. Diferentemente das porcentagens, ela não termina em um número fixo, como 100. Além disso, não é possível comparar a carga média de dois sistemas. Trata-se de um número para quantificar a carga no sistema e relevante apenas a esse sistema. O resultado em questão mostra que a carga média foi de 4,45 no último minuto;  5,18 nos últimos cinco minutos, e assim por diante.

O comando não tem opções nem aceita outro parâmetro além de -V, que indica a versão do comando.

# uptime -V
procps version 3.2.3

 
Aplicação para os usuários Oracle


Não há um uso específico desse comando nos sistemas Oracle, com exceção de que você pode descobrir a carga no sistema para explicar alguns problemas de desempenho. Se perceber alguns problemas no desempenho no banco de dados e constatar a existência de carga elevada de I/O ou na CPU, verifique imediatamente as cargas médias usando o comando uptime. Se identificar uma carga média alta, aprofunde-se para chegar à raiz do problema. Para tanto, existe um verdadeiro arsenal de ferramentas como mpstat, iostat e sar (abordadas
nesta parte da série de orientações).

Imagine um resultado como este:
 
# uptime
 21:31:04 up 330 days,   7:16,  4 users,  load average: 12.90, 1.03, 1.00


É interessante ver como a carga média foi bastante elevada (12,90) no último minuto, mas um tanto baixa, ou mesmo irrelevante, nos últimos 5 e 15 minutos, com 1,03 e 1,00, respectivamente. O que isso significa? Que em menos de 5 minutos, teve início algum processo que causou um salto na carga média no último minuto. Esse processo não estava presente antes, pois as cargas médias anteriores foram pequenas. Esta análise nos leva a nos concentramos em processos iniciados nos últimos minutos, agilizando o processo de resolução do problema.

Naturalmente, como mostra há quanto tempo o servidor está ativo, o comando também explica por que a instância está ativa desde então.

 
who


Quem está conectado ao sistema neste momento? Esta é uma pergunta comum, especialmente se você estiver rastreando um usuário errante que está executando alguns comandos que consomem muitos recursos.

O comando who responde essa pergunta. Este é o uso mais simples, sem argumentos ou parâmetros.
 
# who
oracle   pts/2        Jan  8 15:57  (10.14.105.139)
oracle   pts/3        Jan  8 15:57  (10.14.105.139)
root     pts/1        Dec 26 13:42  (:0.0)
root     :0           Oct 23 15:32


O comando pode usar várias opções. A opção -s é o padrão e produz um resultado igual ao apresentado neste exemplo.

Ao analisar o resultado, você talvez comece a forçar a memória para lembrar-se do significado das colunas. Não se preocupe. Use a opção -H para exibir o cabeçalho:
 

# who -H
NAME     LINE        TIME           COMMENT
oracle   pts/2       Jan  8  15:57  (10.14.105.139)
oracle   pts/3       Jan  8  15:57  (10.14.105.139)
root     pts/1       Dec 26  13:42  (:0.0)
root     :0          Oct 23  15:32


Agora, o significado das colunas está claro. A coluna NAME mostra o nome de usuário da pessoa conectada ao sistema. LINE mostra o nome do terminal. No Linux, cada conexão é identificada como um terminal, com a convenção de nomenclatura  pts/<n> em que <n> é um número que começa com 1. O terminal :0 identifica o terminal X. TIME mostra quando foi efetuado o primeiro login. COMMENTS mostra o endereço IP de onde o usuário efetuou login.

E se você quiser apenas uma lista de nomes de usuários em vez de todos esses detalhes irrelevantes? A opção -q resolve a questão, exibindo os nomes de usuários em uma linha, em ordem alfabética, além de uma contagem do número total de usuários em uma ponta (.45 neste caso):

# who -q
ananda ananda jsmith klome  oracle oracle root root  
                              
… and so on for 45 names
# users=45

Alguns usuários podem ter acabado de efetuar login, mas ainda não estão fazendo nada. Você pode verificar há quanto tempo esses usuários estão inativos, um comando muito útil se você for o chefe: basta usar a opção -u.

# who -uH
NAME     LINE        TIME          IDLE        PID COMMENT
oracle   pts/2       Jan  8 15:57   .        18127 (10.14.105.139)
oracle   pts/3       Jan  8 15:57  00:26     18127 (10.14.105.139)
root     pts/1       Dec 26 13:42   old       6451 (:0.0)
root     :0          Oct 23 15:32    ?       24215


A nova coluna IDLE mostra há quanto tempo o usuário está inativo no formato hh:mm. Está vendo o valor “old” nessa coluna? Ele significa que o usuário está inativo há mais de um dia. A coluna PID mostra o ID do processo da conexão shell.

Outra opção interessante é a –b, que mostra quando o sistema foi reiniciado.

# who -b
         system boot  Feb 15  13:31


Neste exemplo, o sistema foi iniciado em 15 de fevereiro às 13h31. Lembra-se do comando uptime? Ele também mostra há quanto tempo o sistema está ativo. Você pode subtrair os dias mostrados na coluna uptime para saber o dia da inicialização. O comando who -b simplifica bastante a tarefa, pois mostra diretamente a hora da inicialização.

Aviso muito importante: o comando who -b mostra apenas o dia e o mês, mas não informa o ano. Assim, se o sistema estiver em funcionamento há mais de um ano, o resultado não refletirá o valor correto. Desse modo, o comando uptime é sempre a abordagem recomendada, mesmo que você tenha de fazer alguns cálculos. Veja este exemplo:
 
# uptime
 21:37:49 up 675 days, 22:40,1 user,load average: 3.35,3.08, 2.86
# who -b
         system boot   Mar  7 22:58


Observe que a hora da inicialização é exibida como 7 de março. Mas o ano é 2007, não 2008! O comando uptime mostra o período correto – o sistema está ativo há 675 dias. Se efetuar subtrações não for o seu ponto forte, use uma instrução SQL simples para ver qual era a data há 675 dias:

SQL> select sysdate - 675  from dual;
                              
SYSDATE-6
---------
07-MAR-07
                            

A opção -l mostra os logins efetuados no sistema:

# who -lH 
NAME     LINE         TIME         IDLE          PID COMMENT
LOGIN    tty1         Feb 15  13:32              4081 id=1
LOGIN    tty6         Feb 15  13:32              4254 id=6


Para descobrir os terminais de usuário inativos, use a opção -d:

# who -dH
NAME     LINE         TIME         IDLE        PID COMMENT  EXIT
                      Feb 15  13:31            489 id=si    term=0 exit=0
                      Feb 15  13:32           2870 id=l5    term=0 exit=0
         pts/1        Oct 10  14:53          31869 id=ts/1  term=0 exit=0
         pts/4        Jan 11  00:20          22155 id=ts/4  term=0 exit=0
         pts/3        Jun 29  16:01              0 id=/3    term=0 exit=0
         pts/2         Oct 4  22:35           8371 id=/2    term=0 exit=0
         pts/5        Dec 30  03:15            5026 id=ts/5  term=0 exit=0
         pts/4        Dec 30  22:35               0 id=/4   term=0 exit=0


Às vezes, o processo init (o primeiro que tem início quando o sistema é iniciado) dispara outros processos. A opção -p mostra todos os logins ativos.

# who -pH
NAME     LINE         TIME                PID COMMENT
                      Feb 15 13:32       4083 id=2
                      Feb 15 13:32       4090 id=3
                      Feb 15 13:32       4166 id=4
                      Feb 15 13:32       4174 id=5
                      Feb 15 13:32       4255 id=x
                      Oct  4 23:14      13754 id=h1


Mais adiante, você conhecerá outro comando – write – que permite a troca de mensagens em tempo real.  Aprenderá também como desativar a capacidade de outros usuários escreverem no  seu terminal (o comando mesg). Se quiser saber quais usuários permitem e quais não permitem que os outros escrevam em seus terminais, use a opção -T:

# who -TH
NAME       LINE          TIME         COMMENT
oracle   + pts/2        Jan 11 12:08  (10.23.32.10)
oracle   + pts/3        Jan 11 12:08  (10.23.32.10)
oracle   - pts/4        Jan 11 12:08  (10.23.32.10)
root     + pts/1        Dec 26 13:42  (:0.0)
root     ? :0           Oct 23 15:32


O sinal de adição (+) antes do nome do terminal indica a aceitação de comandos de outros usuários; já o sinal de subtração (-) indica que o terminal não permite isso. O sinal “?” nesse campo significa que o terminal não suporta inserções, por exemplo, de uma sessão X-window.

Para obter o atual nível de execução do sistema, use a opção -r:

# who -rH
NAME     LINE         TIME         IDLE          PID COMMENT
         run-level 5  Feb 15  13:31                   last=S


Para obter uma listagem mais descritiva, use a opção -a (todos), que combina as opções -b -d -l -p -r -t -T -u. Portanto, esses dois comandos produzem o mesmo resultado:

# who  -bdlprtTu
# who -a


Segue um exemplo de resultado (com o cabeçalho para que você entenda melhor o significado das colunas):

# who -aH
NAME       LINE          TIME         IDLE     PID  COMMENT  EXIT
                        Feb 15 13:31           489  id=si    term=0 exit=0
           system boot  Feb 15 13:31
           run-level 5  Feb 15 13:31                last=S
                        Feb 15 13:32           2870 id=l5    term=0 exit=0
LOGIN      tty1         Feb 15 13:32           4081 id=1
                        Feb 15 13:32           4083 id=2
                        Feb 15 13:32           4090 id=3
                        Feb 15 13:32           4166 id=4
                        Feb 15 13:32           4174 id=5
LOGIN      tty6         Feb 15 13:32           4254 id=6
                        Feb 15 13:32           4255 id=x
                        Oct  4 23:14          13754 id=h1
           pts/1        Oct 10 14:53          31869 id=ts/1  term=0 exit=0
oracle   + pts/2        Jan  8 15:57   .      18127 (10.14.105.139)
oracle   + pts/3        Jan  8 15:57  00:18   18127 (10.14.105.139)
           pts/4        Dec 30 03:15           5026 id=ts/4  term=0 exit=0
           pts/3        Jun 29 16:01              0 id=/3    term=0 exit=0
root     + pts/1        Dec 26 13:42  old      6451 (:0.0)
           pts/2        Oct  4 22:35           8371 id=/2    term=0 exit=0
root     ? :0           Oct 23 15:32   ?      24215
           pts/5        Dec 30 03:15           5026 id=ts/5  term=0 exit=0
           pts/4        Dec 30 22:35              0 id=/4    term=0 exit=0


Para obter informações de seu próprio login, use a opção -m:

# who -m
oracle   pts/2        Jan  8 15:57  (10.14.105.139)


Notou o valor pts/2? É o número do terminal. Para encontrar seu próprio terminal, use o comando tty:

# tty
/dev/pts/2


Existe uma estrutura de comando especial no Linux para mostrar seu próprio login – who am I – que produz o mesmo resultado apresentado pela opção -m.

# who am i
oracle   pts/2        Jan  8 15:57  (10.14.105.139)


Os únicos argumentos permitidos são “am i" e “mom likes” (sim, acredite ou não!). Ambos produzem o mesmo resultado.

O sistema original do Instant Messenger

Com o advento dos programas de bate-papo e mensagens instantâneas, parece que superamos o desafio de manter uma troca de informações em tempo real sem nos distrairmos com a comunicação por voz. Mas eles são únicos no domínio de programas especiais? O conceito de bate-papo ou mensagem instantânea esteve disponível no *nix por algum tempo. Na verdade, você tem um sistema IM totalmente seguro criado direto dentro no Linux. Ele permite que você converse de maneira seguro com qualquer pessoa conectada ao sistema; sem precisar de conexão com a internet. O bate-papo é habilitado através dos comandos: write, mesg, wall e talk. Vamos examinar cada um deles.

O comando write pode escrever em um terminal do usuário. Se o usuário efetuou login em mais de um terminal, você poderá dirigir-se a um terminal específico. Veja como você escreve a mensagem “Cuidado com o vírus” para o usuário “oracle” conectado no terminal “pts/3”:

 
# write oracle pts/3
Beware of the virus
ttyl 
<Control-D>
#


A combinação de teclas Ctrl-D finaliza a mensagem, retorna a solicitação shell (#) para o usuário e envia para o terminal do usuário. Quando a mensagem mencionada é enviada, o usuário “oracle” verá as seguintes mensagens no terminal pts/3:

Beware of the virus
ttyl


Cada linha surgirá conforme o remetente pressionar a tecla ENTER. Quando o remetente pressiona Ctrl-D, marcando o final da transmissão, o destinatário vê EOF na tela. A mensagem será exibida, independentemente da ação atual do usuário. Se o usuário estiver editando um arquivo em vi, a mensagem aparecerá e o usuário poderá apagá-la pressionando Ctrl-L. Se o usuário estiver na instrução SQL*Plus, a mensagem ainda será exibida, mas não afetará o pressionamento.

O que aconteceria se você não quisesse essa inconveniência? Você não quer que ninguém envie uma mensagem para você ; como se você “deixasse o telefone fora do gancho”. Você não pode fazer isso utilizando o comando mesg. Este comando desativa outras capacidades para enviar uma mensagem para você. O comando sem nenhum argumento mostra a capacidade:

# mesg
is y


Isso mostra que outros podem escrever para você. Para desligá-lo:

# mesg n


Agora para confirmar:

# mesg 
is n


Quando você tenta escrever para os terminais de outros usuários, talvez queira saber quais terminais desativaram escrever de outros. O comando who -T (descrito anteriormente nestas orientações) mostra que:

# who -TH
NAME       LINE          TIME         COMMENT
oracle   + pts/2        Jan 11 12:08 (10.23.32.10)
oracle   + pts/3        Jan 11 12:08 (10.23.32.10)
oracle   - pts/4        Jan 11 12:08 (10.23.32.10)
root     + pts/1        Dec 26 13:42 (:0.0)
root     ? :0           Oct 23 15:32


O sinal + antes do nome do terminal indica que ele aceita comandos write de outros; o sinal “-“ indica que ele não aceita. O sinal “?” indica que o terminal não permite inserções, por exemplo uma sessão X-window.

O que aconteceria se você escrevesse para todos os usuários conectados? Em vez de digitar para cada usuário, utilize o comando wall:

# wall
hello everyone


Quando enviado, o que segue é exibido nos terminais de todos os usuários conectados:

Broadcast message from oracle  (pts/2) (Thu Jan  8 16:37:25 2009):                         
hello everyone
                            

Isso é muito útil para o usuário raiz. Quando quiser desligar o sistema, desmontar um sistema de arquivos ou executar funções administrativas similares, você pode querer que todos os usuários efetuem logoff. Utilize este comando para enviar uma mensagem a todos.

Finalmente, o programa talk permite o bate-papo em tempo real.  Basta digitar o seguinte:

# talk oracle pts/2


Se quiser falar com um usuário em um servidor diferente – prolin2 – você pode utilizar

# talk oracle@prolin2 pts/2


Ele abre uma janela de bate-papo no outro terminal e agora você pode usar o bate-papo em tempo real. Isso é diferente de um programa de bate-papo “profissional” que você está utilizando agora? Provavelmente não. Mas, a propósito, para conseguir conversar, você deve ter certeza de que o talkd daemon está executando, que pode não ter sido instalado.

w

Sim, é um comando, mesmo que for apenas uma letra! O comando w é uma combinação dos comandos uptime e who, determinados um imediatamente após o outro, nessa ordem. Vamos ver um resultado muito comum sem argumentos e opções.

# w
 17:29:22 up 672 days, 18:31,   2 users,  load average: 4.52,  4.54, 4.59
USER    TTY     FROM           LOGIN@  IDLE    JCPU   PCPU WHAT
oracle  pts/1   10.14.105.139  16:43   0.00s   0.06s  0.01s w
oracle  pts/2   10.14.105.139  17:26   57.00s  3.17s  3.17s sqlplus as sysdba
                               
… and so on …

O resultado tem duas partes distintas. A primeira parte mostrar o resultado do comando uptime (descrito anteriormente nessas instruções), que mostra há quanto tempo o servidor está ativo, quantos usuários efetuaram logon e a carga média para os últimos 1, 5 e 15 minutos. As partes do resultado foram explicadas no comando uptime. A segunda parte do resultado mostra o resultado do comando who com a opção -H (também explicado nessas instruções). Novamente, essas diversas colunas foram explicadas no comando who.

Se você prefere não exibir o cabeçalho, utilize a opção -h.

#  w -h
oracle   pts/1     10.14.105.139    16:43    0.00s   0.02s  0.01s w -h


Isso remove o cabeçalho do resultado. É útil nos scripts shell, onde você quer ler e agir de acordo com o resultado sem a tarefa adicional de pular o cabeçalho.

A opção -s produz uma versão compacta (curta) do resultado, removendo o tempo de login, e os tempos de JPCU e PCPU.

# w -s
 17:30:07 up 672 days, 18:32,   2 users,  load average: 5.03,  4.65, 4.63
USER     TTY      FROM               IDLE WHAT
oracle   pts/1     10.14.105.139     0.00s w -s
oracle   pts/2     10.14.105.139     1:42  sqlplus   as sysdba


Você pode achar que o campo “FROM” não é realmente muito útil. Ele mostra o endereço IP do mesmo servidor, pois os logins estão em todos os locais. Para economizar espaço no resultado, você pode querer suprimi-lo. A opção -f desativa a impressão do campo FROM:

# w -f
17:30:53 up 672 days, 18:33,   2 users,  load average: 4.77,  4.65, 4.63
USER     TTY        LOGIN@   IDLE    JCPU   PCPU WHAT
oracle   pts/1      16:43    0.00s  0.06s   0.00s w -f
oracle   pts/2      17:26    2:28   3.17s   3.17s sqlplus   as sysdba


O comando só aceita um parâmetro: o nome de um usuário. Por padrão, w mostra o processo e o login de todos os usuários. Se você colocar um nome de usuário, ele mostrará o login somente daquele usuário. Por exemplo, para mostrar o login somente da raiz, emita:

# w -h root
root  pts/1 :0.0 26Dec08 13days 0.01s   0.01s bash
root  :0      -  23Oct08 ?xdm?  21:13m  1.81s  /usr/bin/gnome-session


A opção -h foi utilizada para suprimir a exibição do cabeçalho.

kill

Um processo está executando e você quer que ele seja finalizado. O que você deve fazer? O processo executa em segundo plano, assim não é preciso ir até o terminal e pressionar Ctrl-C; ou, o processo pertence a outro usuário (utilizando o mesmo ID de usuário, como “oracle”) e você quer finalizá-lo. O comando kill vem para resgatar, ele faz o que o nome sugere – ele destroi o processo. O uso mais comum é:

# kill  
                              
<Process ID of the Linux process>

Suponha que você queira destruir um processo chamado sqlplus emitido pelo usuário oracle, você precisa conhecer seu processid, ou PID:

# ps -aef|grep sqlplus|grep ananda
oracle    8728 23916  0 10:36 pts/3   00:00:00 sqlplus
oracle    8768 23896  0 10:36 pts/2   00:00:00  grep sqlplus


Agora para eliminar o PID 8728:

# kill 8728


É isso, o processo é eliminado. Claro, você precisa ser o mesmo usuário (oracle) para eliminar um processo iniciado pelo oracle. Para eliminar processos iniciados por outros usuários, você precisa ser superusuário – raiz.

Às vezes você pode simplesmente querer interromper o processo, em vez de eliminá-lo. Utilize a opção -SIGSTOP com o comando kill.

# kill -SIGSTOP 9790
# ps -aef|grep sqlplus|grep oracle
oracle    9790 23916   0 10:41 pts/3  00:00:00 sqlplus  as sysdba
oracle    9885 23896  0 10:41 pts/2   00:00:00  grep sqlplus


Isso é ótimo para tarefas em Segundo plano, mas com processos em primeiro plano, ele simplesmente interrompe o processo e remove o controle do usuário. Então, se você marcar o processo novamente após emitir o comando,

# ps -aef|grep sqlplus|grep oracle
oracle    9790 23916  0 10:41 pts/3  00:00:00 sqlplus   as sysdba
oracle   10144 23896  0 10:42 pts/2  00:00:00  grep sqlplus


verá que o processo ainda está executando. Ele não foi finalizado. Para eliminar este processo, e todos os processos persistentes que se recusam a ser finalizado, você precisa passar um novo sinal chamado SIGKILL. O sinal padrão é SIGTERM.

# kill -SIGKILL 9790
# ps -aef|grep sqlplus|grep oracle
oracle   10092 23916  0 10:42 pts/3    00:00:00 sqlplus   as sysdba
oracle   10198 23896  0 10:43 pts/2    00:00:00  grep sqlplus


Observe as opções -SIGSTOP e -SIGKILL, que passam um sinal específico (stop e kill, respectivamente) para o processo. Da mesma forma, há vários outros sinais que você pode utilizar. Para obter uma lista de todos os sinais disponíveis, utilize a opção -l (que é a letra “L”, não o número “1”):

# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD
18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
30) SIGPWR      31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1
36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4  39) SIGRTMIN+5
40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5
60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1
64) SIGRTMAX


Você também pode utilizar o número equivalente do sinal em vez do nome real do sinal. Por exemplo, em vez de eliminar -SIGKILL 9790, você pode eliminar -9 9790.

A propósito, este é um comando interessante. Lembre-se: quase todos os comandos Linux são, em geral, arquivos executáveis localizados em /bin, /sbin/, /user/bin e diretórios similares. O executável PATH determina onde esses arquivos de comando podem ser encontrados. Alguns outros comandos são, na verdade, o comando “incorporado”, ou seja, eles são parte do próprio shell. Um dos exemplos é o comando kill. Para demonstrar, temos o seguinte:

# kill -h 
-bash: kill: h: invalid signal  specification


Observe o resultado que retornou do shell apropriado. A utilização está incorreta, pois o argumento -h não estava previsto. Agora, utilize o seguinte:

# /bin/kill -h
usage: kill [ -s signal | -p ]  [ -a ] pid ...
       kill -l [ signal ]


Aha! Esta versão do comando kill como um executável no diretório /bin aceitou a opção -h corretamente. Agora você sabe a diferença sutil entre os comandos shell built-in e seus utilitários homônimos na forma de arquivos executáveis. Por que é importante saber a diferença? Porque a funcionalidade varia significativamente nesses dois formulários. O comando kill integrado tem menos funcionalidade do que seu utilitário equivalente. Quando você emite o comando kill está, na verdade, chamando o aplicativo incorporado, não o utilitário.  Para adicionar outra funcionalidade, você precisa utilizar o utilitário /bin/kill.

O utilitário kill tem muitas opções e argumentos. O mais popular é o comando kill, para eliminar os processos com nomes do processo, em vez de PIDs. Veja um exemplo onde você quer eliminar todos os processos como nome sqlplus:

# /bin/kill sqlplus
[1]   Terminated              sqlplus
[2]   Terminated              sqlplus
[3]   Terminated              sqlplus
[4]   Terminated              sqlplus
[5]   Terminated              sqlplus
[6]   Terminated              sqlplus
[7]-  Terminated              sqlplus
[8]+  Terminated              sqlplus


Às vezes você pode querer ver se todos os IDs do processo kill terminarão. A opção -p faz isso. Ela imprime todos os PIDs que seriam eliminados, sem realmente eliminá-los. Isso serve como uma confirmação antes da ação:

#  /bin/kill -p sqlplus
6798
6802
6803
6807
6808
6812
6813
6817


O resultado mostra os PIDs dos processos que seriam eliminados. Se você emitir o comando novamente sem a opção -p, isso eliminará todos os processos.

Nesse momento, você pode estar tentando a conhecer os outros comandos que estão “integrados” no shell, em vez de ser utilitário.

# man -k builtin
. [builtins]       (1)   - bash built-in commands, see bash(1)
: [builtins]       (1)   - bash built-in commands, see bash(1)
[ [builtins]       (1)   - bash built-in commands, see bash(1)
alias [builtins]   (1)   - bash built-in commands, see bash(1)
bash [builtins]    (1)   - bash built-in commands, see bash(1)
bg [builtins]      (1)   - bash built-in commands, see bash(1)
                               
… and so on …

Algumas entradas parecem familiares: alias, bg e assim em diante. Alguns são puramente integrados, por exemplo, alias. Não existe arquivo executável chamado alias.

Aplicação para os usuários Oracle

Eliminar um processo tem vários usos: quase todos para eliminar processos zumbis, processos que estão em Segundo plano e outros que foram interrompidos respondendo aos comandos normais de desligamento.
Por exemplo, a instância do banco de dados Oracle não está desligando como resultado de algum problema de memória. Você precisa desativá-lo, eliminando um dos principais processos, como pmon ou smon. Esta não deverá ser uma atividade para ser executada o tempo todo, apenas quando você não tenha muitas opções.

Talvez você queira eliminar todas as sessões sqlplus ou todas as tarefas rman utilizando o comando kill. Os processos Oracle Enterprise Manager executam como processos perl; ou executam processos DBCA ou DBUA, que você pode querer eliminar rapidamente:

# /bin/kill perl rman perl dbca  dbua java


Existe também um uso mais comum do comando. Quando você quer encerrar uma sessão do usuário no Oracle Database, em geral você faz o seguinte:

  • Localiza o SID e o Serial# da sessão Elimina a sessão utilizando o comando ALTER SYSTEM Vamos ver o que acontece quando queremos eliminar a sessão do usuário SH.


SQL> select sid, serial#,  status
  2  from v$session
  3* where username = 'SH';
       SID    SERIAL# STATUS
---------- ---------- --------
       116       5784  INACTIVE
 
SQL> alter system kill  session '116,5784'
  2  /
 
System altered.
 
It’s killed; but when you check the status of the session:
 
       SID    SERIAL# STATUS
---------- ---------- --------
       116       5784 KILLED


Ele é exibido como KILLED, não completamente perdido. Isso acontece porque o Oracle espera até que o usuário SH entre na sua sessão e tente fazer algo, durante o qual ele obtém a mensagem “ORA-00028: sua sessão foi eliminada”. Depois disso, a sessão desaparece de V$SESSION.

Uma maneira mais rápida para eliminar uma sessão é eliminar o processo do servidor correspondente no nível Linux. Para fazer isso, primeiro localize o PID do processo do servidor:

SQL> select spid
  2  from v$process
  3  where addr =
  4  (
  5     select paddr
  6     from v$session
  7     where username =  'SH'
  8  );
SPID
------------------------
30986


O SPID é o ID do Processo do processo do servidor. Agora elimine este processo:

# kill -9 30986


Agora, se você marcar a exibição V$SESSION, ela desaparecerá imediatamente. O usuário não obterá uma mensagem imediatamente; mas se ele tentar executar uma consulta no banco de dados, obterá:

ERROR at line 1:
ORA-03135: connection lost  contact
Process ID: 30986
Session ID: 125 Serial number:  34528


Este é um método mais rápido para eliminar uma sessão, mas há algumas restrições. O banco de dados do Oracle precisa executar uma limpeza da sessão – recuperação de alterações e assim em diante. Assim, isso seria executado somente quando as sessões estiverem inativas. Do contrário, você pode utilizar uma das outras duas formas para eliminar uma sessão imediatamente:

alter system disconnect session  '125,35447' immediate;
alter system disconnect session  '125,35447' post_transaction;

 


killall

Diferente da dupla natureza do comando kill, o killall é apenas um utilitário, ou seja, é um programa executável no diretório /usr/bin. Ele é similar ao comando kill em funcionalidade, mas em vez de eliminar um processo baseado no seu PID, ele aceita o nome do processo como um argumento. Por exemplo, para eliminar todos os processos sqlplus, emita:

# killall sqlplus


Isso elimina todos os processos sqlplus nomeados (que você tem permissão para eliminar, claro). Diferente do comando integrado kill, não é necessário saber o ID do Processo dos processos a serem eliminados.

Se o comando não finalizar o processo, ou o processo não responder a um sinal TERM, você poderá enviar um sinal SIGKILL explícito, conforme foi visto no comando kill utilizando a opção -s.
 
# killall -s SIGKILL sqlplus


Como o kill, você pode utilizar a opção -9 em vez de -s SIGKILL. Para obter uma lista de todos os sinais disponíveis, utilize a opção -l.

# killall -l
HUP INT QUIT ILL TRAP ABRT IOT  BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN  TTOU URG XCPU XFSZ VTALRM PROF WINCH IO
PWR SYS
UNUSED


Para obter um resultado prolixo do comando killall, utilize a opção -v:

# killall -v sqlplus
Killed sqlplus(26448) with signal 15
Killed sqlplus(26452) with signal 15
Killed sqlplus(26456) with signal 15
Killed sqlplus(26457) with signal 15
                               
… and so on …

Às vezes você pode querer examinar o processo antes de finalizá-lo. A opção -i permite que você execute-a de maneira interativa. Esta opção solicita a sua entrada antes de eliminá-la:

# killall -i sqlplus
Kill sqlplus(2537) ? (y/n) n
Kill sqlplus(2555) ? (y/n) n
Kill sqlplus(2555) ? (y/n) y
Killed sqlplus(2555) with signal 15


O que acontece quando você passa um nome wrong_process?

# killall wrong_process
wrong_process: no process  killed


Não há nenhum processo em execução chamado wrong_process, então nada foi eliminado e o resultado mostrou isso claramente. Para suprimir essa reclamação “nenhum processo eliminado”, utilize a opção -q. Esta opção é útil em scripts shell onde você não pode analisar o resultado.  Particularmente, você quer capturar o código de retorno do comando:

# killall -q wrong_process
# echo $?
1


O código de retorno (mostrado pela variável shell $?) é “1”, em vez de “0”, significando uma falha. Você pode marcar o código de retorno para examinar se o processo killall foi executado com sucesso, ou seja, o código de retorno foi “0”.

Uma coisa interessante sobre este comando é que ele não elimina a se próprio. Claro, ele elimina outros comandos killall determinados em outro lugar, mas não em si próprio.

 


Aplicação para os usuários Oracle

Assim como o kill, o comando killall também é utilizado para eliminar processos. A maior vantagem do comando killall é a capacidade de exibir o processid e a natureza interativa. Suponha que você queira eliminar todos os processos perl, java, sqlplus, rman e dbca, mas de maneira interativa; você pode emitir:

# killall -i -p perl sqlplus  java rman dbca
Kill sqlplus(pgid 7053) ? (y/n) n
Kill perl(pgid 31233) ? (y/n) n
                               
... and so on ...

Isso permite que você veja o PID antes de eliminá-los, o que pode ser muito útil.

Conclusão

Nessas orientações, você aprender sobre esses comandos (mostrados em ordem alfabética)

dig

Uma versão mais recente do nslookup

ifconfig

Para exibir informações nas interfaces de rede

kill

Eliminar um processo específico

killall

Eliminar um processo específico, um grupo de processos e nomes correspondentes a um padrão

mesg

Para ativar e desativar a capacidade das outras pessoas a exibir algo no terminal de alguém.

netstat

Para exibir estatísticas e outras medições sobre a utilização da interface de rede

nslookup

Para pesquisar um nome do host para seu endereço IP ou pesquisar o endereço IP para seu nome do host no DNS

talk

Para estabelecer um sistema de mensagem instantânea entre dois usuários para bate-papo em tempo real

uptime

Há quanto tempo o sistema esteve ativo e sua carga média de 1, 5 e 15 minutos

w

Combinação de uptime e who

wall

Para exibir algum texto nos terminais de todos os usuários conectados

who

Para exibir os usuários conectados no sistema e o que eles estão fazendo

write

Para exibir instantaneamente algo em uma sessão do terminal de um usuário específico


Conforme mencionei anteriormente, não tenho a intenção de apresentar cada comando disponível nos sistemas Linux. Você precisa dominar somente alguns deles para administrar um sistema de maneira eficiente e essa série mostra os mais importantes. Pratique-os no seu ambiente para compreender muito bem esses comandos, com seus parâmetros e opções. Na próxima parte, a última você aprenderá  como administrar um ambiente, Linux – em uma máquina normal, em uma máquina virtual e distribuída.


Arup Nanda ( arup@proligence.com) é exclusivamente DBA (administrador de bancos de dados) Oracle há mais de 12 anos, com experiência que abrange todas as áreas da tecnologia de bancos de dados da Oracle, e foi eleito o "DBA do Ano" pela Oracle Magazine em 2003. Arup faz apresentações e escreve artigos com frequência em eventos e publicações relacionados à Oracle e atua como  diretor Oracle ACE.