FreeBSD

13 de julho de 2016

Processos no FreeBSD

Mais artigos de »
Escrito por: Leonardo Souza
Tags:

Resumo: neste artigos apresentaremos a teoria por trás de processos e daemons do sistema. Nele veremos o que são, como funcionam e como interagir com eles.

Processos no FreeBSD

O FreeBSD é um sistema operacional multi-tarefas, isso significa que ele consegue executar várias tarefas ao mesmo tempo. Cada comando executado pelo usuário inicia pelo menos um novo processo e o próprio sistema utiliza vários deles para realizar as tarefas básicas de funcionamento, além de iniciar e parar vários outros por conta própria, apenas para funcionar da forma que precisa funcionar.

De uma forma geral os processos são tarefas que são executadas pelo sistema para alcançar determinado fim. Imagine um programa em execução, este programa consegue realizar várias tarefas, para cada tarefa um ou mais processos precisam ser executados. Dessa forma, na maioria das vezes um programa possui vários processos sendo executados simultaneamente para realizar a execução de suas tarefas.




Cada processo possui uma identificação única no sistema, esta identificação ocorre por meio do process ID, ou seja o PID. Semelhante aos arquivos e diretórios do sistema, como explicado no artigo sobre permissões, os processos também possuem dono e grupo. Estas informações de grupo e dono são utilizadas pelo sistema, para determinar que arquivos e dispositivos o processo poderá abrir, ou seja, utilizando as permissões discutidas no artigo já citado.

Além de dono e grupo, a maioria dos processos possuem também um processo pai, ou seja, o processo que o iniciou. Imagine que executou um comando no Shell, neste exemplo, o Shell é um processo e todo comando executado nele iniciará um processo que terá como pai o processo que o iniciou, ou seja, o Shell. Existe uma única exceção, é o caso do processo chamado INIT, pois ele sempre será o primeiro processo do sistema, dessa forma, seu PID será sempre 1. Ele é executado pelo kernel quando o FreeBSD é iniciado.

Para se verificar os processos ativos no sistema, podemos utilizar dois comandos em particular: ps e top. O comando ps é usado para apresentar uma lista estática dos processos que estão em execução no momento. Ele nos mostra o PID do processo, quantidade de memória que está sendo utilizada por ele, a linha de comando que o iniciou, etc. Por outro lado, o comando top apresenta todos os processos em execução, atualizando seu status a cada poucos segundos. Dessa forma é possível acompanhar os processos em execução de forma dinâmica.

Comando PS

Por padrão o comando ps apresenta os processos que estão sendo executados pelo usuário logado, e cuja prioridade seja dele também. Veja abaixo um exemplo da execução deste comando.

# ps

ps

Podemos ver que a saída deste comando é organizada em várias colunas, veremos uma por uma agora:

PID: é a identificação do processo, como explicado anteriormente, este número começa com o número 1 e pode chegar até 99999, reiniciando novamente a contagem sempre que este valor for atingido.

TT: nos mostra em que terminal o programa está sendo executado.

STAT: nos apresenta o status atual do programa.

TIME: indica a quantidade de tempo em que este programa está sendo executado, não necessária mente o tempo total do programa, e sim o tempo que o processo está utilizando a CPU, afinal é possível que este processo tenha ficado um tempo aguardando outras tarefas serem concluídas para finalmente utilizar a CPU e realizar o que precisa fazer.

COMMAND: é a linha de comando que foi utilizada para executar este programa.

É possível utilizar alguns parâmetros junto com este comando como, por exemplo, as opções auxww. A letra a apresenta informações sobre todos os processos em execução e não apenas os do usuário logado. A opção u retorna o nome do usuário que é dono do processo, assim como o uso da memória. A opção x apresenta informações sobre o daemon do processo, enquanto ww apresenta a linha de comando completa, e não um trecho apenas.

Comando TOP

Este comando nos retorna uma lista com os processos em execução e quanto de recursos ele tem consumido para executar suas tarefas. Na imagem abaixo temos um exemplo de saída padrão deste comando.

# top

top1

Podemos ver que a saída do comando é dividida em duas partes: o cabeçalho e o corpo das informações. Veja abaixo o que representa cada informação:

Cabeçalho: composto pelas cinco primeiras linhas, apresenta o PID do processo em execução, a média de carga do sistema, ou seja, quanto o sistema está ocupado, o tempo de atividade do sistema sem interrupção, isso quer dizer, desde sua inicialização (uptime), quantidade de processos ativos, quantidade de memória e swap foi utilizado e quanto tempo o sistema está gastando em estados diferentes de uso da CPU.

Na segunda parte temos algumas colunas contendo informações semelhantes a saído do comando ps, entre estas informações temos o usuário, o tempo de CPU utilizado, quantidade de memória utilizada pelo processo, etc. Estas informações são divididas em duas partes, uma para o tamanho total, e outra para o tamanho residente. Tamanho total é a quantidade de memória utilizada até o momento pelo programa, tamanho residente é quantidade em uso no momento.

Por padrão as informações são atualizadas a cada dois segundos, porém este comportamento pode ser modificado através da opção s.

Daemons do sistema

Embora a maioria dos programas que utilizamos exijam uma interação do usuário, nem todos os processos são assim. Isso significa que existem alguns programas que são projetados de forma a não utilizar informações continuas do usuário, e não precisam estar conectados a um terminal “iniciador do processo”. Este tipo de programa são chamados de Daemons.

Na prática os daemons são softwares que executam tarefas no sistema sem exigir que o usuário interaja diretamente com eles, mantendo assim, até certo ponto, uma autonomia, porém não independência do usuário do sistema. Um exemplo básico disso é o servidor DNS, serviço que traduz nomes em IPs e números de IPs em nomes de computadores, por exemplo. A palavra daemons é uma referencias a personagens da mitologia grega, que não eram nem bons e nem maus, mas apenas espíritos assistentes que essencialmente realizavam tarefas úteis para a humanidade. Explicamos melhor este termo no artigo “o mascote do FreeBSD é um demônio“?

Enviando Sinais a processos

Como explicado, na maioria das vezes não será necessário interagir com o daemon, entretanto, em alguns momentos pode ser necessário esta interação com eles. Este processo é chamado de sinais, por meio deles é possível se comunicar com o daemon, ou qualquer outro processo em execução. Dessa forma podemos iniciar, parar e finalizar processos.

Existem vários tipos de sinais possíveis que podem ser enviados, alguns possuem significado específico, e outros são interpretados pela aplicação e ela decidirá o que fazer com este sinal de acordo com o propósito especificado na documentação desta aplicação. Normalmente um usuário só conseguirá enviar sinais para os processos que pertencem a ele. Dessa forma, se tentar enviar, por exemplo, um sinal do tipo kill para um processo que não lhe pertence, terá permissão negada.

Por outro lado, o próprio FreeBSD enviará, em casos específicos, sinais às aplicações. Se uma aplicação tentar acessar endereços de memória que não deve acessar, o FreebSD enviará um sinal de violação de segmento ao processo (Segmentation Violation), conhecido como SIGSEGV. Da mesma forma se uma aplicações utilizou uma chamada de sistema do tipo alarm para solicitar que seja alertada após um certo período de tempo, o sistema enviará um alerta deste tipo ao processo, sinal conhecido como SIGALRM e assim por diante.

Na lista abaixo estão listados os sinais de controle comuns:

Tabela_signal

Comando Kill

O comando kill envia sinais de controle para processos (veja a tabela sinais de controle). O sinal padrão enviado pelo comando, quando não for especificado qualquer parâmetro é o SIGTERM, que possui valor numérico 15. Porém o processo não obedece necessariamente ao sinal, a não ser que o sinal especificado seja SIGKILL. É possível também utilizar o comando SIGHUP como uma ordem para o processo releia seus arquivos de configuração.

Abaixo vemos um exemplo de uso do comando kill com uma das opções da tabela sinais de controle.

# kill –TERM 726

Comando kill

Como a maioria dos comando UNIX, o kill não retornará qualquer mensagem informando se o comando foi bem sucedido, ou seja, executou a tarefa corretamente. Porém se tentar enviar um sinal para um processo que não lhe pertence, receberá uma mensagem indicando a falha na operação.

Conclusão

Tudo que é executado no sistema, de certa forma é um processo, por este motivo conhecer os fundamentos deles é essencial não só para usuários do FreeBSD, mas de qualquer sistema baseado em UNIX. Usuários do mundo GNU/Linux, com frequência, precisam interagir com processos e daemons do sistema, como uma forma de administrá-lo, incluem-se nisso iniciar, parar, reiniciar, etc. Portanto, conhecer o que são processos e seu funcionamento é a melhor maneira de utilizar os sistemas, tirando o melhor resultado possível.






Sobre o Autor

Foto de perfil de Leonardo Souza
Leonardo Souza
Bacharel em Informática, pós graduado em Segurança de Redes de Computadores e analista de Segurança da Informação. Entusiasta de Segurança da Informação e usuário FreeBSD, porém sem xiismo.




0 Comments


Seja o Primeiro a Comentar!


You must be logged in to post a comment.