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:
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/down –
ativa 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:
- 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.
- 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.
- Local Address é a origem da conexão e o número da porta do programa.
- 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.
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.
Social