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:
- a ferramenta de serviço, que -nesses sistemas mais antigos- era usada para gerenciar scripts SysVinit, e
- 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.
- 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.