Segue o resumo de comandos e conceitos vistos em Sala de Aula.
Este é um material de apoio aos meus alunos que tem todo embasamento durante as aulas presenciais.
Você pode fazer o exercício desta aula no seguinte link:
http://dailson.blogspot.com.br/2012/10/exercicio-da-aula-9-gerenciamento-de.html
As respostas deste exercício estão no seguinte link:
http://www.dailson.blogspot.com.br/2012/10/exercicio-da-aula-9-gerenciamento-de.html
Você pode encontrar todos os resumos de aula no link abaixo:
http://www.dailson.com.br/2009/05/indice-mini-tutoriais-usados-em-aula.html
Comunicação entre processos:
O Linux possui diversas formas de realizar comunicação entre processos, também conhecido com IPC. Estas formas de comunicação se referem a processos em execução na mesma máquina, o que não inclui sockets ou RPC (são para comunicação entre máquinas distintas).
Dentre as técnicas de comunicação entre processos fornecidas pelo Linux, convém citar:
a) por memória compartilhada: através de diretivas shm* pode-se disponibilizar uma área de memória comum à vários processos. Simples: quando um processo quer enviar dados ao outro, põe na memória.
b) pipes: um método muito interessante onde se cria um canal bidirecional na tabela de descritores, como se fosse arquivo, mas não é (e não tem I/O). Quando você faz um ls -la | sort está usando pipe!
c) sinais: quando um processo quer sinalizar algo a outro processo. Ao contrário das demais nesta não se envia dados mas apenas um valor numérico.
Existem outras formas de comunicação como semáforos, fila de mensagens e até mesmo morte de filho, que é considerada uma comunicação. Se você digitar ipcs na linha de comando irá ver os canais de comunicação atualmente em uso (não sinais).
Texto retirado do Artigo: http://www.vivaolinux.com.br/artigo/Sinais-em-Linux/?pagina=1
Comandos:
Listar os processos do terminal
# ps
Listar os processos de todos os terminais
# ps -a
# ps a (exibe os processos mais detalhes)
LIstar os processos dos usuários
# ps -u
# ps -au
Lista todos os processos do Sistema
# ps -A
# ps -ef
# ps -eF
# ps -ely
# ps ax
# ps aux (exibe uma coluna com o nome do usuário que iniciou o processo)
Exibe todos os processos em forma de árvore
# pstree
# ps -ejH
# ps axfj
Obs: teste os vários parâmetros do comando pstree:
-a
Mostra opções passadas na linha de comando.
-c
Mostra toda a estrutura (inclusive sub-processos do processo pai).
-G
Usa caracteres gráficos no desenho da árvore de processos.
-h
Destaca o processo atual e seus antecessores.
-H [pid]
Destaca o processo especificado.
-l
Não faz quebra de linha
-n
Classifica pelo número PID ao invés do nome.
-p
Mostra o número PID entre parênteses após o nome do processo.
-u
Mostra também o dono do processo.
-U
Usa o conjunto de caracteres Unicode para o desenho da árvore.
Exibe informações sobre Threads
# ps -eLf
# ps axms
Exibe informações de segurança dos processos
# ps -eo euser,ruser,suser,fuser,f,comm,label
# ps axZ
# ps -eM
Exibe todos os processos que estão sendo executados com permissões de root (real e com ID)
# ps -U root -u root u
Especificando as colunas para visualização:
Exemplos:
Apenas o Numero do processo e o comando que o gerou
# ps ao PID,COMMAND
Apenas o numero do processo, o comando que gerou o pid, o uso da CPU e da memória
# ps ao pid,%cpu,%mem,command
Outros exemplos tirados do manual do ps:
# ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
# ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
# ps -eo pid,tt,user,fname,tmout,f,wchan
Exibir processos e prioridade do processo (Coluna NI)
# ps l
# ps -l
# ps -Al
# ps -el
Significado das Principais colunas do comando TOP:
USER - Nome do usuário dono do processo.
UID - Número de identificação do usuário dono do processo.
PID - Número de identificação do processo.
PPID - Número de identificação do processo pai de cada tarefa.
PRI - Número de prioridade da tarefa. (Números altos são prioridades baixas).
NI - Valor preciso da prioridade da tarefa.
%CPU - O consumo de processamento do processo.
%MEM - O consumo de memória do processo.
SIZE - Tamanho do código da tarefa em kilobytes.
RSS - Soma total da memória física usada pelo processo, em kilobytes.
WCHAN - Endereço ou nome da função do kernel da tarefa que está atualmente suspensa.
STAT - Estado do processo: S - Suspenso, R - em Execução, T - Interrompido, Z - Terminado, etc.
TTY - Terminal onde são executados os processos.
TIME - Tempo total da CPU usado pelo processo desde que foi iniciado.
COMMAND - Nome do comando do processo.
Entendendo os Sinais:
Sinais são usados quando se deseja enviar uma mensagem para um processo, mas esta mensagem não é um texto, mas sim um código cujo significado é pré determinado. Antes de mais nada, para dar o melhor exemplo possível, quando se executa um kill 7000 está se enviando para o processo 7000 o sinal de código 15 que significa algo como "Caro processo, queria gentilmente terminar a sua execução".
Como o sinal 15 significa terminar, o processo irá terminar a sua execução. Como todos já devem saber, se o "gentil" processo recusar-se a terminar, posso forçar com um kill -9 7000, onde envio para ele o sinal 9 que significa algo como: "Morra!" (uma vez disse em um curso que com sinal 15 eu dou a arma para o processo esperando que ele aperte o gatilho, depois de escrever o seu testamento, fechar suas finanças etc. Com o -9 é um tiro na testa sem aviso).
Principais Sinais:
Sinal 1: Significa reinício do programa. Este sinal é chamado de SIGHUP.
Sinal 2: Sinal chamado de SIGINT. Causa uma interrupção no programa. Falando em termos práticos, é um sinal 2 que o programa recebe quando se pressiona Control+C.
Sinal 15: esta é a solicitação de morte, chamada de SIGTERM. Ao receber um sinal 15 o processo deveria preparar-se para terminar, fazendo "seus últimos pedidos" e ele mesmo encerrando normalmente sua execução.
Sinal 9: SIGKILL. Este é a morte indefensável. Não pode ser mascarado, ou seja, o programador não consegue substituir a rotina de tratamento do Sistema Operacional que simplesmente tira o processo da fila de prontos. Deve ser usado em último caso, pois um sinal 15 é mais elegante por dar a chance ao processo de se preparar para sua morte.
Sinal 20: SIGTSTOP. Este sinal de STOP faz com que o processo interrompa a sua execução. Veja, ele não termina, apenas interrompe.
Sinal 18: SIGCONT. Este sinal de CONTINUAR, faz com que o processo que foi interrompido pelo Sinal 20, continue seu processamento.
Fonte: http://www.vivaolinux.com.br/artigo/Sinais-em-Linux/?pagina=2
Enviando Sinais para os Processos:
Vamos utilizar dois comandos. O KILL e o KILLALL.
A diferença entre estes dois comandos é que o KILL envia sinais para os números dos processos e o KILLALL envia para nomes.
Exemplo:
Abro o vim em um terminal. E suponho que ele está travado. Quero enviar um sinal para este processo. Com o comando KILL precisariamos de dois passos:
1º Vou para outro terminal e executo o comando ps a
2º Anoto o PID do VIM
3º kill -15 o número do PID do vim.
Exemplo: kill -15 4567
Usando o KILLALL, iríamos para outro terminal e fariamos apenas:
# killall -15 vim
Obs: Porém se tiver mais programas vim abertos, todos receberão o mesmo sinal.
Para os exemplos abaixo, vamos supor que estamos enviando sinais para o processo 4567 - backup.sh
Reiniciando o processo
# kill -SIGHUP 4567
# kill -1 4567
Interrompendo o programa
# kill -SIGINT 4567
# kill -2 4567
Encerrando um programa (educadamente)
# kill -SIGTERM 4567
# kill -15 4567
Matando um processo (LUNGA MODE=ON)
# kill -SIGKILL 4567
# kill -9 4567
Parando (congelando) um processo na memória
# kill -SIGSTOP 4567
# kill -20 4567
Retomando o processo (congelado no tópico anterior)
# kill -SIGCONT 4567
# kill -18 4567
Primeiro Plano (FOREGROUND) e Segundo Plano (BACKGROUND)
Você sabia que no mesmo terminal posso iniciar vários processos e deixá-lo em background. Ainda tenho a opção de deixá-lo parado ou executando.
Para termos um bom exemplo de programas executando em segundo plano, vamos criar um pequeno script que terá a função apenas de contar de 1 até infinito.
Passos para escrever o script:
vim conta.sh
#!/bin/bash
while : ;
do
let i++
done
Pressione a tecla ESC e digite :x
Tornando o script executável
# chmod +x conta.sh
Executando o script:
# ./conta.sh
Parece que ele não está fazendo nada, mas ele está contando de 1 até infinito. Para cancelar o programa, basta digitar CTRL+C
OBs: CTRL+C é o mesmo que kill -SIGINT ou kill -2
Iniciando um processo.
Vamos colocar em segundo plano os programas vim /etc/services, nano, man ls, cat /etc/services | more,
# vim /etc/services
Pressione CTRL+Z
O processo vai para segundo plano.
# man ls
Pressione CTRL+Z
O processo vai para segundo plano.
# cat /etc/services | less
Pressione CTRL+Z
O processo vai para segundo plano.
# cat /etc/services | more
Pressione CTRL+Z
O processo vai para segundo plano.
E por ultimo vamos chamar o nosso programa, o conta.sh
# ./conta.sh
Exibindo os processos que estão em segundo plano (background):
# jobs
Se você seguiu meus exemplos acima, você terá esta lista:
[1] Stopped vim /etc/services
[2] Stopped man ls
[3] Stopped cat /etc/services | less
[4]- Stopped cat /etc/services | more
[5]+ Stopped ./conta.sh
Ativando programas que estão em Segundo Plano
Na listagem acima, o processo conta.sh é um programa que está com o status Stopped. Mas sabemos que este programa tem a função de contar. Para ativar este programa você tem duas
maneiras possíveis:
A primeira é mandar o sinal SIGCONT para ele. A outra, bem mais fácil é fazer o seguite:
# bg 5
Ao executar o comando jobs, veja como ficou nossa lista:
[1] Stopped vim /etc/services
[2] Stopped man ls
[3] Stopped cat /etc/services | less
[4]- Stopped cat /etc/services | more
[5]+ Running ./conta.sh &
Note que agora o conta.sh status Running (executando) e apareceu um novo símbolo ao lado do nome do programa: &
O Símbolo & avisa que o programa está sendo executado em segundo plano.
Se você desejar parar novamente o conta.sh, basta digitar:
# killall -SIGSTOP conta.sh
Mais uma vez, vamos ver como ficou através do comando jobs
[1] Stopped vim /etc/services
[2] Stopped man ls
[3] Stopped cat /etc/services | less
[4]- Stopped cat /etc/services | more
[5]+ Running ./conta.sh &
Outra maneira de ativá-lo novamnete é enviando um sinal através do comando KILL
# killall -SIGCONT conta.sh
Trazendo para primeiro plano (foreground) programas que estão em segundo plano (background).
De posse da lista de processos que estão em segundo plano, basta você digitar o comando fg e número do programa nesta lista e você terá o programa de volta em primeiro plano.
Observe a lista do comando jobs:
[1] Stopped vim /etc/services
[2] Stopped man ls
[3] Stopped cat /etc/services | less
[4]- Stopped cat /etc/services | more
[5]+ Running ./conta.sh &
# fg 1 (trará o vim /etc/services para primeiro plano)
Para voltar para background digite mais uma vez CTRL+Z.
Emita o comando jobs mais uma vez:
# jobs
Veja o resultado da lista:
[1]+ Stopped vim /etc/services
[2] Stopped man ls
[3] Stopped cat /etc/services | less
[4] Stopped cat /etc/services | more
[5]- Stopped ./conta.sh
Notou que agora o sinal de + saiu da posição 5 e foi para a posição 1? E o sinal de menos da posição 4 para a posição 5?
Estes sinais demonstram os dois últimos programas que foram colocados em backgroud. Caso você digite fg sem parametros, o programa que virá para primeiro plano é o que tem o
sinal + e o próximo da fila que era o - torna-se + e assim por diante.
Colocando programas em segundo plano diretamente na linha de comando.
# ./conta.sh &
O Uso do & já coloca o programa em segundo plano em execução.
Repita este comando várias vezes, e veja um resultado semelhante a este:
[1]+ Stopped vim /etc/services
[2] Stopped man ls
[3] Stopped cat /etc/services | less
[4] Stopped cat /etc/services | more
[5]- Stopped ./conta.sh
[6] Running ./conta.sh &
[7] Running ./conta.sh &
[8] Running ./conta.sh &
[9] Running ./conta.sh &
[10] Running ./conta.sh &
[11] Running ./conta.sh &
Obs: Toda vez que você chama um programa já em segundo plano, o Shell exibe na linha abaixo o número do processo no qual ele está submetido.
[dailson@server tmp]$ ./conta.sh &
[11] 12642
Outra observação importante é que quando executamos um programa em segundo plano e ele acaba sua execução o Shell avisa emitindo uma mensagem na própria linha de comando.
Teste você mesmo. Execute o comando que atualiza o banco de dados do comando locate.
# updatedb &
[12] 12649
Fique pressionando enter algumas vezes. Em determinado momento o Shell emite a seguinte mensagem:
Done [12] 12649
Informando que o processo já foi concluido.
Prioridade de Processos no Linux
Os processos no Linux (no espaço do usuário) vão de -20 a +19.
A prioridade padrão de qualquer processo iniciado pelo usuário é 0.
Numeros negativos, indicam maior prioridade e numeros positivos, prioridades baixas.
Para visualizar a prioridade dos processos do sistema, utilize o seguinte comando:
# ps al
O Resultado é parecido com este:
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 3988 1 17 0 3016 400 ? Ss+ tty1 0:00 /sbin/mingetty tty1
4 0 3989 1 16 0 2708 400 ? Ss+ tty2 0:00 /sbin/mingetty tty2
4 0 3990 1 17 0 2156 400 ? Ss+ tty3 0:00 /sbin/mingetty tty3
4 0 3991 1 17 0 2204 400 ? Ss+ tty4 0:00 /sbin/mingetty tty4
4 0 3992 1 17 0 2044 400 ? Ss+ tty5 0:00 /sbin/mingetty tty5
4 0 3993 1 16 0 2884 400 ? Ss+ tty6 0:00 /sbin/mingetty tty6
0 525 16849 21405 17 0 3724 636 - R+ pts/0 0:00 ps al
0 525 21405 21404 15 0 6168 1472 wait Ss pts/0 0:00 -bash
Ou se preferir, você pode filtrar com o comando que aprendemos na aula de ps:
# ps ao pid,ni,command (assim só aparece o pid, a coluna NICE e o comando que gerou).
Observe a coluna: NI. Ela tem os valores que falamos.
Note que todo processo iniciado pelo usuário tem prioridade 0.
Vamos ver agora a listagem completo com os processos do sitema.
# ps -axl | more
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 1 0 16 0 2512 548 ? S ? 0:00 init [3]
1 0 2 1 -100 - 0 0 migrat S ? 0:03 [migration/0]
1 0 3 1 34 19 0 0 ksofti SN ? 0:00 [ksoftirqd/0]
1 0 4 1 -100 - 0 0 migrat S ? 0:02 [migration/1]
1 0 5 1 34 19 0 0 ksofti SN ? 0:00 [ksoftirqd/1]
1 0 6 1 -100 - 0 0 migrat S ? 0:02 [migration/2]
1 0 7 1 34 19 0 0 ksofti SN ? 0:00 [ksoftirqd/2]
1 0 8 1 -100 - 0 0 migrat S ? 0:02 [migration/3]
1 0 9 1 34 19 0 0 ksofti SN ? 0:00 [ksoftirqd/3]
1 0 10 1 5 -10 0 0 worker S< ? 0:00 [events/0]
1 0 11 1 5 -10 0 0 worker S< ? 0:00 [events/1]
1 0 12 1 5 -10 0 0 worker S< ? 0:00 [events/2]
1 0 13 1 5 -10 0 0 worker S< ? 0:00 [events/3]
1 0 14 1 6 -10 0 0 worker S< ? 0:00 [khelper]
1 0 15 1 5 -10 0 0 worker S< ? 0:00 [kthread]
1 0 16 15 15 -10 0 0 worker S< ? 0:00 [kacpid]
1 0 94 15 5 -10 0 0 worker S< ? 0:00 [kblockd/0]
1 0 95 15 5 -10 0 0 worker S< ? 0:00 [kblockd/1]
1 0 96 15 5 -10 0 0 worker S< ? 0:00 [kblockd/2]
1 0 97 15 5 -10 0 0 worker S< ? 0:00 [kblockd/3]
Note na coluna NI que existem processos com prioridades baixíssimas (19) e outros com prioridade -10.
Iniciando processos fora da prioridade Padrão
Vamos aprender a usar o comando nice
# nice -n prioridade processo
Exemplo: Vamos usar o nosso programa conta.sh como exemplo. Vamos iniciá-lo com a menor prioridade possível e já em segundo plano:
# nice -n +19 ./conta.sh &
Veja o resultado:
# ps -al
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 525 26483 21405 99 99 19 - 1234 - pts/0 00:00:02 conta.sh
0 R 525 26484 21405 0 76 0 - 878 - pts/0 00:00:00 ps
Agora vamos iniciá-lo com a prioridade -10
# nice -n -10 ./conta.sh &
Veja o resultado:
# ps -al
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 525 26483 21405 99 99 -10 - 1234 - pts/0 00:00:02 conta.sh
0 R 525 26484 21405 0 76 0 - 878 - pts/0 00:00:00 ps
Alterando a prioridade de um processo que já está em execução.
Desta vez vamos utilizar o comando renice.
# renice -n prioridade processo
Vamos usar o exemplo anterior. O conta.sh tem o pid 26483 e o processo tem prioridade -10.
Vamos mudar para -5 (lembre-se que o processo já está em execução)
# renice -5 -p 26483
Veja o resultado:
# ps -al
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 525 26483 21405 99 99 -5 - 1234 - pts/0 00:00:02 conta.sh
0 R 525 26484 21405 0 76 0 - 878 - pts/0 00:00:00 ps
Vamos mudar para 0
# renice 0 -p 26483
Veja o resultado:
# ps -al
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 525 26483 21405 99 99 0 - 1234 - pts/0 00:00:02 conta.sh
0 R 525 26484 21405 0 76 0 - 878 - pts/0 00:00:00 ps
NOHUP
O nohup é um comando que faz com que os processos ignorem o sinal hangup (sinal 1 - interrupção).
Vamos executar um processo que não poderá ser finalizado, veja o exemplo:
# nohup ./conta.sh
nohup: appending output to `nohup.out'
Este recurso é utilizado como recurso de iniciar programas e fazer lougout. Com isso o programa fica rodando em background mesmo que o terminal (ou janela do ambiente gráfico)
seja encerrado. O Resultado do comando é direcionado para o arquivo nohup.out
Veja este exemplo:
# nohup vim
# killall -1 vi
# ps -aux | grep vi
root 988 0.6 11.0 22120 13152 ? S 08:27 0:06 kghostview /mnt/w
root 1001 14.3 3.0 8500 3572 pts/3 RN 08:38 0:50 vi
root 1026 0.0 0.5 1724 668 pts/4 S 08:44 0:00 grep vi
Observe que o processo não foi finalizado, então agora vamos finalizá-lo:
Monitorando processos em Tempo Real
Para monitorar processos em tempo real poderemos utilizar duas ferramentas: o top e o htop.
O comando top já vem por padrão nas distribuições linux.
Basta digitar:
# top
Este programa atualiza a tela a cada 5s. Se quiser uma monitoração segundo a segundo, digite:
# top -d 1
O Top também aceita comandos quando está em execução:
[Space] Atualizar a tela imediatamente
[h] Exibir uma tela de ajuda
[k] Matar (kill) um processo. Você deverá indicar o ID do processo e o sinal a ser enviado para ele.
[n] Alterar o número de processos exibidos. Você deverá indicar o número.
[u] Ordenar por usuário.
[M] Ordenar por uso da memória.
[P] Ordenar por uso da CPU.
Dica:
Aplicações como o Apache, Mozilla e o Nautilus são thread-aware — são criados threads múltiplos para lidar com usuários múltiplos ou pedidos múltiplos, e cada thread recebe um
ID de processo. Por default, o ps e o top exibem somente o thread principal (inicial). Para visualizar todos os threads, use o comando ps -m ou pressione [Shift]-[H] no top.
Fonte: http://web.mit.edu/rhel-doc/3/rhel-sag-pt_br-3/ch-sysinfo.html
HTOP
Este programa não vem por padrão nas distribuições, mas é o melhor de todos! Usa cores, gráficos e teclas de atalhos bem mais fáceis do que o engessado TOP.
Digite:
# htop
Caso você não tenha este programa, instale na sua distribuição.
Debian e derivados:
# apt-get install htop
Redhat, Fedora, CentOS...
# yum install htop
Note que as barras já dão uma idéia melhor de poder de processamento, memória RAM e Swap.
Na parte inferior, tem as teclas de atalho (sempre teclas de função) que dão acesso rápido aos recursos:
F1 - Ajuda
F2 - Altera cores, graficos e personaliza o htop
F3 - Procura processos (ps aux | grep ...)
F4 - Inverte a ordem da ordenação escolhida no F6
F5 - Exibe os processos em forma de árvore (pstree)
F6 - Ordena a visualização do programa (Por consumo de cpu, memoria...)
F7 - Diminui a prioridade de um processo (renice -1)
F8 - Aumenta a prioridade de um processo (renice +1)
F9 - Envia sinais para os processos (kill e killall)
F10 - Sai do programa
Fontes:
http://www.guiafoca.org/cgs/guia/inic_interm/ch-run.html#s-run-controle
http://dainf.ct.utfpr.edu.br/~maziero/doku.php/unix:gestao_de_processos
http://web.mit.edu/rhel-doc/3/rhel-sag-pt_br-3/ch-sysinfo.html
http://www.vivaolinux.com.br/artigo/Criando-monitorando-e-terminando-processos?pagina=3