Pesquisa de site

Série RHCSA: Gerenciamento de processos no RHEL 7: inicialização, desligamento e tudo mais - Parte 5


Começaremos este artigo com uma revisão geral e breve do que acontece desde o momento em que você pressiona o botão Power para ligar seu servidor RHEL 7 até ser apresentado o login tela em uma interface de linha de comando.

Observe que:

1. os mesmos princípios básicos se aplicam, talvez com pequenas modificações, também a outras distribuições Linux, e
2. a descrição a seguir não pretende representar uma explicação exaustiva do processo de inicialização, mas apenas os fundamentos.

Processo de inicialização do Linux

1. O POST (Power On Self Test) inicializa e executa verificações de hardware.

2. Quando o POST termina, o controle do sistema é passado para o carregador de inicialização de primeiro estágio, que é armazenado no setor de inicialização de um dos discos rígidos (para os mais antigos sistemas usando BIOS e MBR) ou uma partição (U)EFI dedicada.

3. O carregador de inicialização de primeiro estágio carrega o carregador de inicialização de segundo estágio, geralmente o GRUB (GRand Unified Boot Loader), que reside dentro de /boot, que por sua vez carrega o kernel e o sistema de arquivos inicial baseado em RAM (também conhecido como initramfs, que contém programas e arquivos binários que executam as ações necessárias para, em última análise, monte o sistema de arquivos raiz real).

4. É apresentada uma tela inicial que nos permite escolher um sistema operacional e kernel para inicializar:

5. O kernel configura o hardware conectado ao sistema e uma vez montado o sistema de arquivos raiz, inicia o processo com PID 1, que por sua vez inicializará outros processos e apresentará nós com um prompt de login.

Nota: Se desejarmos fazer isso posteriormente, podemos examinar as especificidades deste processo usando o comando dmesg e filtrando sua saída usando as ferramentas que nós explicaram em artigos anteriores desta série.

No exemplo acima, usamos o conhecido comando ps para exibir uma lista de processos atuais cujo processo pai (ou em outras palavras, o processo que os iniciou) é systemd (o gerenciador de sistema e serviço para o qual a maioria das distribuições Linux modernas mudaram) durante a inicialização do sistema:

ps -o ppid,pid,uname,comm --ppid=1

Lembre-se de que o sinalizador -o (abreviação de –format) permite apresentar a saída de ps em um formato personalizado para atender às suas necessidades usando as palavras-chave especificadas na seção STANDARD FORMAT SPECIFIERS em man ps.

Outro caso em que você desejará definir a saída de ps em vez de usar o padrão é quando você precisa encontrar processos que estão causando uma carga significativa de CPU e/ou memória e classificá-los de acordo:

ps aux --sort=+pcpu              # Sort by %CPU (ascending)
ps aux --sort=-pcpu              # Sort by %CPU (descending)
ps aux --sort=+pmem              # Sort by %MEM (ascending)
ps aux --sort=-pmem              # Sort by %MEM (descending)
ps aux --sort=+pcpu,-pmem        # Combine sort by %CPU (ascending) and %MEM (descending)

Uma introdução ao SystemD

Poucas decisões no mundo Linux causaram mais controvérsias do que a adoção do systemd pelas principais distribuições Linux. Os defensores do Systemd apontam como principais vantagens os seguintes fatos:

Leia também: A história por trás de ‘init’ e ‘systemd’

1. O Systemd permite que mais processamento seja feito em paralelo durante a inicialização do sistema (ao contrário do antigo SysVinit, que sempre tende a ser mais lento porque inicia os processos um por um, verifica se um depende do outro, e então espera que os daemons sejam lançados para que mais serviços possam ser iniciados), e

2. Funciona como um gerenciamento dinâmico de recursos em um sistema em execução. Assim, os serviços são iniciados quando necessário (para evitar o consumo de recursos do sistema caso não estejam sendo utilizados) em vez de serem iniciados sem um motivo válido durante a inicialização.

3. Compatibilidade com versões anteriores de scripts SysVinit.

Systemd é controlado pelo utilitário systemctl. Se você tem experiência em SysVinit, é provável que esteja familiarizado com:

  1. a ferramenta de serviço, que -nesses sistemas mais antigos- era usada para gerenciar scripts SysVinit, e
  2. o utilitário chkconfig, que serviu ao propósito de atualizar e consultar informações de nível de execução para serviços do sistema.
  3. desligamento, que você deve ter usado várias vezes para reiniciar ou interromper um sistema em execução.

A tabela a seguir mostra as semelhanças entre o uso dessas ferramentas legadas e o systemctl:

Legacy tool Systemctl equivalent Description
service name start systemctl start name Start name (where name is a service)
service name stop systemctl stop name Stop name
service name condrestart systemctl try-restart name Restarts name (if it’s already running)
service name restart systemctl restart name Restarts name
service name reload systemctl reload name Reloads the configuration for name
service name status systemctl status name Displays the current status of name
service –status-all systemctl Displays the status of all current services
chkconfig name on systemctl enable name Enable name to run on startup as specified in the unit file (the file to which the symlink points). The process of enabling or disabling a service to start automatically on boot consists in adding or removing symbolic links inside the /etc/systemd/system directory.
chkconfig name off systemctl disable name Disables name to run on startup as specified in the unit file (the file to which the symlink points)
chkconfig –list name systemctl is-enabled name Verify whether name (a specific service) is currently enabled
chkconfig –list systemctl –type=service Displays all services and tells whether they are enabled or disabled
shutdown -h now systemctl poweroff Power-off the machine (halt)
shutdown -r now systemctl reboot Reboot the system

Systemd também introduziu os conceitos de unidades (que podem ser um serviço, um ponto de montagem, um dispositivo ou um soquete de rede) e alvos (que é como o systemd consegue iniciar vários processos relacionados ao mesmo tempo e pode ser considerado - embora não igual - como o equivalente aos níveis de execução em sistemas baseados em SysVinit.

Resumindo

Outras tarefas relacionadas com a gestão de processos incluem, mas não podem estar limitadas a, a capacidade de:

1. Ajustar a prioridade de execução no que diz respeito à utilização de recursos do sistema de um processo:

Isto é feito através do utilitário renice, que altera a prioridade de agendamento de um ou mais processos em execução. Em termos simples, a prioridade de escalonamento é um recurso que permite ao kernel (presente nas versões => 2.6) alocar recursos do sistema de acordo com a prioridade de execução atribuída (também conhecida como gentileza, em uma faixa de -20 a 19) de um determinado processo.

A sintaxe básica de renice é a seguinte:

renice [-n] priority [-gpu] identifier

No comando genérico acima, o primeiro argumento é o valor de prioridade a ser usado, enquanto o outro argumento pode ser interpretado como IDs de processo (que é a configuração padrão), IDs de grupo de processos, IDs de usuários ou nomes de usuários. Um usuário normal (diferente do root) só pode modificar a prioridade de agendamento de um processo de sua propriedade e apenas aumentar o nível de gentileza (o que significa consumir menos recursos do sistema).

2. Elimine (ou interrompa a execução normal) de um processo conforme necessário:

Em termos mais precisos, matar um processo dá direito a enviar-lhe um sinal para terminar a sua execução normalmente (SIGTERM=15) ou imediatamente (SIGKILL=9) através do kill ou pkill. comandos.

A diferença entre essas duas ferramentas é que a primeira é usada para encerrar um processo específico ou um grupo de processos, enquanto a última permite fazer o mesmo com base no nome e outros atributos.

Além disso, pkill vem junto com pgrep, que mostra os PIDs que serão afetados caso o pkill seja usado. Por exemplo, antes de executar:

pkill -u gacanepa

Pode ser útil visualizar rapidamente quais são os PIDs de propriedade do gacanepa:

pgrep -l -u gacanepa

Por padrão, tanto kill quanto pkill enviam o sinal SIGTERM para o processo. Como mencionamos acima, este sinal pode ser ignorado (enquanto o processo termina sua execução ou para sempre), então quando você precisar seriamente parar um processo em execução por um motivo válido, você precisará especificar o SIGKILL sinal na linha de comando:

kill -9 identifier               # Kill a process or a process group
kill -s SIGNAL identifier        # Idem
pkill -s SIGNAL identifier       # Kill a process by name or other attributes 

Conclusão

Neste artigo explicamos os fundamentos do processo de inicialização em um sistema RHEL 7 e analisamos algumas das ferramentas que estão disponíveis para ajudá-lo no gerenciamento de processos usando utilitários comuns. e comandos específicos do systemd.

Observe que esta lista não se destina a cobrir todos os detalhes deste tópico, então sinta-se à vontade para adicionar suas próprias ferramentas e comandos preferidos a este artigo usando o formulário de comentários abaixo. Perguntas e outros comentários também são bem-vindos.