Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
Próxima revisão
Revisão anterior
unix:gestao_de_processos [2012/03/23 18:45] mazierounix:gestao_de_processos [2020/08/18 19:17] (atual) – edição externa 127.0.0.1
Linha 1: Linha 1:
 +====== UNIX: Gestão de processos ======
 +
 +===== Programas e processos =====
 +
 +**Programas** são arquivos em disco contendo instruções para execução pelo processador, enquanto **processos** são as execuções em andamento. Cada processo executando no sistema em um determinado momento é identificado por um número único, o ''PID'' - //Process IDentifier//. Além disso, cada processo possui outras informações que o caracterizam, como:
 +
 +  * Usuário proprietário (aquele que lançou o processo)
 +  * Sessão de shell de onde foi lançado (se foi lançado através de um shell)
 +  * Estado atual (//Running//, //Suspended//, //SWapped//, ...)
 +  * Linha de comando usada para lançá-lo.
 +  * Uso de memória e CPU
 +  * etc.
 +
 +No UNIX, os seguintes comandos permitem observar a atividade dos processos no sistema:
 +
 +  * ''ps'' : permite listar todos os processos ativos no sistema.
 +  * ''pstree'' : mostra as dependências entre processos.
 +  * ''top'' : mostra a atividade do sistema, atualizando a tela a cada N segundos. Permite interagir com os processos do usuário que está executando o comando (tecle "?" para uma tela de ajuda).
 +  * ''free'' : apresenta informações gerais sobre uso de CPU e memória.
 +  * ''vmstat'' : gera estatísticas sobre o uso de memória virtual, CPU, etc.
 +  * ''renice'' : permite alterar a prioridade de base dos processos, que vai de -20 (máxima) a +20 (mínima), tendo como prioridade default o valor zero (0). Usuários normais só podem alterar as prioridades dos seus próprios processos, e só podem diminuir as prioridades.
 +
 +===== Os comandos ps e pstree =====
 +
 +Podemos visualizar os processos em execução no sistema através do comando ''ps'', cuja execução sem parâmetros gera uma listagem como a seguinte:
 +
 +<code>
 +$ ps
 +PID    TTY  STAT   TIME   COMMAND
 +14726  p3        0:02   -tcsh
 +17884  p3        0:00   ps
 +</code>
 +
 +O comando ''ps'' aceita uma série de parâmetros, entre os quais os mais importantes são:
 +
 +  * ''a'' : mostra processos de outros usuários também (//all//).
 +  * ''u'' : mostra listagem mais detalhada dos processos, com uso de memória e CPU
 +  * ''x'' : mostra processos não conectados a terminais.
 +  * ''w'' : mostra mais detalhes sobre as linhas de comando dos processos.
 +
 +Para obter uma listagem completa dos processos em execução no sistema usam-se as opções **auxw**, que geram uma listagem como a que segue:
 +
 +<code>
 +$ ps auxw
 +USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
 +bin        315  0.0  0.1   780   312  ?  S   Apr 22   1:01 portmap
 +daemon     293  0.0  0.1   796   344  ?  S   Apr 22   0:00 /usr/sbin/atd
 +daemon   14477  0.0  0.1   796   396  ?  S    16:55   0:00 /usr/sbin/atd
 +edouard  15281  0.0  0.3  1504   908  ?  S    17:21   0:00 imapd
 +ftp      18017  0.1  0.3  1364   808  ?  S    18:31   0:00 ftpd: 200.134.48.57: anonymous/gzbaron@ufpr.br: IDLE
 +gzbaron  20688  0.0  1.2  3980  3092  ?  S   Apr 27   0:00 wish ./tik.tcl
 +jamhour  14478  0.0  0.2  1196   660  ?  S N  16:55   0:00 sh
 +jamhour  14479  0.0  0.2  1024   684  ?  S N  16:55   0:00 wget -c http://www.apache.org/dist/apache_1_3_6_win32.exe
 +jamhour  15188  0.0  0.4  1884  1200  p0 S    17:18   0:00 -tcsh
 +maziero  14726  0.0  1.0  3268  2580  p3 S    17:03   0:02 -tcsh
 +maziero  18019  0.0  0.1   860   496  p3 R    18:31   0:00 ps auxw
 +nobody     473  0.0  4.9 13972 12788  ?  S   Apr 22   2:30 squid
 +...
 +</code>
 +
 +Os principais campos dessa listagem são:
 +
 +  * ''USER'' : o proprietário do processo, que pode ser quem o lançou ou, no caso de executáveis com o bit SUID habilitado, o proprietário do arquivo executável.
 +  * ''PID'' : número do processo.
 +  * ''%CPU'' : porcentagem da CPU usada pelo processo.
 +  * ''%MEM'' : porcentagem da memória usada pelo processo.
 +  * ''SIZE'' : memória total usada pelo processo.
 +  * ''RSS'' : memória física (RAM) usada pelo processo.
 +  * ''TTY'' : terminal ao qual o processo está ligado.
 +  * ''STAT'' : status do processo (rodando, suspenso, ...).
 +  * ''START'' : data de lançamento do processo.
 +  * ''TIME'' : tempo total de CPU usado pelo processo.
 +  * ''COMMAND'' : comando usado para lançar o processo.
 +
 +O comando ''pstree'' é útil por mostrar a hierarquia existente entre os processos ativos no sistema:
 +
 +<code>
 +$ pstree
 +init-+-apmd
 +     |-atd
 +     |-crond
 +     |-gpm
 +     |-httpd---8*[httpd]
 +     |-inetd-+-2*[imapd]
 +           `-3*[in.ftpd]
 +     |-kflushd
 +     |-klogd
 +     |-kpiod
 +     |-kswapd
 +     |-lpd
 +     |-mdrecoveryd
 +     |-6*[mingetty]
 +     |-miniserv.pl
 +     |-named
 +     |-nfsd---lockd---rpciod
 +     |-7*[nfsd]
 +     |-nmbd---nmbd
 +     |-portmap
 +     |-powerd
 +     |-rpc.mountd
 +     |-rpc.rquotad
 +     |-rpc.statd
 +     |-rpc.yppasswdd
 +     |-safe_mysqld---mysqld---mysqld---mysqld
 +     |-sendmail---sendmail
 +     |-smbd---3*[smbd]
 +     |-squid---squid-+-5*[dnsserver]
 +                   `-unlinkd
 +     |-sshd---sshd---tcsh---pstree
 +     |-syslogd
 +     |-tcsh---kvt---tcsh
 +     |-update
 +     |-xdm
 +     |-xfs
 +     |-xntpd
 +     |-6*[xterm---tcsh]
 +     |-ypbind---ypbind
 +     `-ypserv
 +</code>
 +
 +===== O comando top =====
 +
 +O comando ''top'' é uma versão iterativa do comando ''ps'', atualizando a listagem de processos a cada //n// segundos, e ordenando-os por uso de CPU e memória. Ele é bastante útil para compreender o que está sendo processado pela máquina em um determinado instante. Eis uma tela típica do comando top:
 +
 +<code>
 +8:07am  up 2 days, 19:05,  1 user,  load average: 0.00, 0.00, 0.00
 +97 processes: 96 sleeping, 1 running, 0 zombie, 0 stopped
 +CPU states:  7.3% user,  1.8% system,  0.0% nice,  1.9% idle
 +Mem:  128032K av, 123480K used,   4552K free,  37904K shrd,  22404K buff
 +Swap: 385548K av,   9856K used, 375692K free                 49576K cached
 +
 +  PID USER     PRI  NI  SIZE  RSS SHARE STAT  LIB %CPU %MEM   TIME COMMAND
 + 1871 maziero   15    1024 1024   820 R        4.7  0.7   0:00 top
 +    1 root           104   56    40 S        0.0  0.0   0:03 init
 +    2 root                0     0 SW      0  0.0  0.0   0:06 kflushd
 +    3 root                0     0 SW      0  0.0  0.0   0:00 kpiod
 +    4 root                0     0 SW      0  0.0  0.0   0:03 kswapd
 +    5 root     -20 -20        0     0 SW>      0.0  0.0   0:00 mdrecoveryd
 +  109 root            60    0     0 SW      0  0.0  0.0   0:00 apmd
 +  262 bin        0     236  220   160 S        0.0  0.1   0:02 portmap
 +  277 root          4372 4332   212 S        0.0  3.3   0:52 ypserv
 +  292 root            76    0     0 SW      0  0.0  0.0   0:00 ypbind
 +  298 root           180  124    80 S        0.0  0.0   0:00 ypbind
 +  338 root            80   28    16 S        0.0  0.0   0:00 powerd
 +  386 daemon         136  104    64 S        0.0  0.0   0:00 atd
 +  400 root           164  112    76 S        0.0  0.0   0:00 crond
 +  414 root           144   80    40 S        0.0  0.0   0:04 inetd
 +  428 root          2004 1464   500 S        0.0  1.1   0:23 named
 +  435 root           392  336   264 S        0.0  0.2   0:11 sshd
 +</code>
 +
 +Existem diversas interfaces gráficas para visualização dos processos do sistema, entre elas o ''ktop''.
 +
 +===== Background e foreground =====
 +
 +O shell pemite lançar processos a partir da linha de comando. Normalmente cada comando digitado é executado na forma de um processo, e o shell espera o término do processo lançado para devolver o controle ao usuário. Essa forma de operação é chamada //foreground operation//, e torna o shell inacessível até que o processo lançado seja terminado.
 +
 +Uma forma alternativa de lançamento de processos pelo shell é a chamada //background operation//, que consiste em lançar processos sem perder o controle do shell. Para isso bastar adicionar o caractere ''&'' ao final da linha do shell. Dessa forma, o processo será lançado em //background//, e o shell permanecerá disponível ao usuário. Por exemplo, para lançar o editor GEdit sem perder o controle do shell bastar digitar:
 +
 +<code>
 +$ gedit &
 +</code>
 +
 +As seguintes operações no shell são possíveis durante uma execução de processo em //foreground//:
 +
 +  * ''^C'' : interrompe (mata) o processo, encerrando sua execução.
 +  * ''^Z'' : suspende o processo. um processo suspenso pode ser retornado à operação em //foreground//, através do comando ''fg'' (ou ''fg %job'', quando houverem vários processos suspensos), ou transferido para operação em //background//, através do comando ''bg'' (ou ''bg %job'', idem).
 +
 +O comando ''jobs'' permite verificar quais os processos em //background// lançados pelo shell corrente. É importante que o shell só pode terminar (via comando ''exit'' ou ''logout'') quando todos os seus jobs tiverem terminado.
 +
 +===== o comando kill =====
 +
 +O comando ''kill'' //-sinal// permite enviar sinais aos processos em execução. Somente o proprietário do processo e o usuário root podem enviar sinais. Os sinais mais usados são os seguintes:
 +
 +  * 15 (TERM): solicita ao processo seu término.
 +  * 9 (KILL): mata o processo, sem mais delongas.
 +  * 1 (HUP): solicita releitura dos arquivos de configuração (para os principais serviços básicos).
 +
 +Assim, para eliminar um processo que não responde mais a comandos e recusa-se a terminar, basta executar ''kill -9 pid'', onde //pid// corresponde ao número identificador do processo, obtido através dos comandos ''ps'' ou ''top''.
 +
 +===== Os comandos at e batch =====
 +
 +O comando ''at'' permite agendar a execução de um comando para uma hora e data definida pelo usuário. Os resultados (via //stdout//) das execuções agendadas serão enviados ao usuário por e-mail. Vejamos um exemplo:
 +
 +<code>
 +$ at 23:50 12/31/2031
 +> echo "Feliz 2032 a todos" | mail user@ufpr.br
 +> who
 +> ^D
 +</code>
 +
 +O comando ''batch'' permite agendar uma execução de comandos sem data marcada, assim que a carga do sistema o permitir. Da mesma forma que no comando ''at'', eventuais resultados (//stdout//) das execuções são enviados ao usuário por e-mail.
 +
 +Verifique as páginas de manual dos comandos ''at'' e ''batch'' para maiores detalhes.
 +
 +===== Agendando programas via crontab =====
 +
 +Enquanto o comando ''at'' permite agendar uma tarefa para uma determinada data, o sistema ''crontab'' permite o agendamento de tarefas repetitivas ao longo do dia, semana, mês ou ano. Toda a informação sobre tarefas agendadas via ''crontab'' é mantida em um arquivo dentro do diretório ''/var/spool/cron'', que não é diretamente acessível. O acesso ao arquivo é feito pelo comando ''crontab'':
 +
 +  * ''crontab -e'' : editar o arquivo com as definições de tarefas
 +  * ''crontab -l'' : listar o conteúdo do arquivo atual
 +  * ''crontab -r'' : remover o arquivo.
 +
 +A estrutura do arquivo de crontab é relativamente complexa mas permite muita flexibilidade. Vejamos um exemplo:
 +
 +<code>
 +# Usar o shell /bin/sh to run commands
 +SHELL=/bin/sh
 +
 +# enviar stdout para maziero, mesmo sendo o crontab de outro usuario
 +MAILTO=maziero
 +
 +# Explicação do formato
 +# minuto, hora, dia, mês, dia da semana, comando
 +5 0 * * *       $HOME/bin/daily.job 1> $HOME/tmp/out 2>&1
 +
 +# Rodar às 14:15 todo início de mês
 +15 14 1 * *     $HOME/bin/monthly.job
 +
 +# Rodar às 22:30 todos os dias úteis
 +30 22 * * 1-5   mail -s "São 22:30, vá para casa !" maziero > /dev/null
 +
 +# Outros exemplos
 +23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
 +5 4 * * sun     echo "run at 04:05 every sunday"
 +</code>
 +
 +Para maiores informações podem ser obtidas via páginas de manual (''man crontab'' para o comando e ''man 5 crontab'' para o arquivo de configuração).
 +
 +===== Exercícios =====
 +
 +  - Execute o comando top em uma janela, mostrando apenas seus processos, enquanto faz os exercícios em outra janela.
 +  - Quantos processos você está executando neste momento?
 +  - O que faz o comando ''kill -9 -1''?
 +  - Quais os programas com maior utilização de CPU que estão rodando?
 +  - Mostre a quantidade de processadores que seu computador tem conforme o que consta no arquivo ''/proc/cpuinfo''
 +  - Mostre a quantidade de memória disponível no seu computador conforme o que consta no arquivo ''/proc/meminfo''
 +  - Verifique quais os processos em atividade no sistema atualmente, identificando o uso de memória e CPU de cada um (dica: use o comando ''ps auxw | more''). Identifique o significado de cada uma das colunas da listagem obtida (ver a página de manual). Quais os processos que mais consomem recursos do sistema ?
 +  - Efetue uma conexão SSH (Secure Shell) em um servidor. Do lado do cliente e do servidor, identifique os processos envolvidos no estabelecimento da conexão SSH e como eles se relacionam.
 +  - Você é o administrador de um sistema e precisa desconectar imediatamente todos os usuários contectados via SSH. Como você poderia fazer isso?
 +  - Agende uma operação remoção dos arquivos ''.bak'' do seu diretório HOME e sub-diretórios para as 23:55, todas as segundas, quartas e sextas-feiras.