Gerenciando processos
Nesta aula, você aprenderá a gerenciar processos no Windows usando PowerShell. Vamos explorar os cmdlets Get-Process, Stop-Process e Start-Process, além de técnicas de filtragem para selecionar processos específicos. Ao final, você estará apto a monitorar, iniciar e encerrar processos de forma eficiente em scripts e no dia a dia.
Gerenciar processos é uma tarefa fundamental para qualquer administrador de sistemas ou desenvolvedor que trabalhe com Windows. No PowerShell, temos cmdlets específicos que facilitam a visualização, criação e encerramento de processos, permitindo automação e controle fino sobre o sistema. Nesta aula, vamos nos aprofundar nos cmdlets Get-Process, Stop-Process e Start-Process, além de explorar técnicas de filtragem para selecionar processos com base em critérios específicos.
Dominar esses comandos é essencial para diagnosticar problemas, otimizar o desempenho e automatizar tarefas repetitivas. Vamos começar entendendo como obter informações detalhadas sobre os processos em execução e, em seguida, como interagir com eles de forma segura e controlada.
Get-Process
O cmdlet Get-Process é a ferramenta principal para obter informações sobre os processos em execução no sistema. Ele retorna objetos que representam cada processo, contendo propriedades como nome, ID (PID), uso de memória, tempo de CPU, entre outras. Sem parâmetros, ele lista todos os processos ativos, mas podemos especificar processos por nome ou ID para obter informações detalhadas de um processo específico.
A sintaxe básica é:
Get-Process [-Name] <nome> | [-Id] <id> | [-InputObject] <Processo>
Por exemplo, para listar todos os processos, use:
Get-Process
Para obter informações sobre o processo do Bloco de Notas, use:
Get-Process -Name notepad
Também é possível usar curingas, como Get-Process -Name *notepad* para encontrar processos que contenham "notepad" no nome. O cmdlet retorna objetos do tipo System.Diagnostics.Process, que podem ser manipulados e formatados conforme necessário.
Uma propriedade útil é WorkingSet64, que representa a memória física usada pelo processo. Para exibir uma tabela personalizada com nome, PID e memória, podemos usar:
Get-Process | Select-Object Name, Id, WorkingSet64 | Format-Table -AutoSize
Além disso, podemos ordenar por uma propriedade, como uso de memória:
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 Name, Id, WorkingSet64
Isso lista os 10 processos que mais consomem memória, o que é útil para monitoramento rápido.
Stop-Process
O cmdlet Stop-Process é usado para encerrar um ou mais processos. Ele pode receber o nome do processo, o PID ou um objeto de processo vindo de Get-Process. É importante ter cuidado ao usar esse comando, pois encerrar processos críticos do sistema pode causar instabilidade ou perda de dados.
A sintaxe básica é:
Stop-Process -Name <nome> | -Id <id> | -InputObject <Processo> [-Force]
Para encerrar todos os processos do Bloco de Notas, por exemplo:
Stop-Process -Name notepad
Se o processo não responder, você pode forçar a finalização com o parâmetro -Force:
Stop-Process -Name notepad -Force
Também é possível encerrar por PID:
Stop-Process -Id 1234
Uma prática comum é combinar Get-Process com Stop-Process para encerrar processos que correspondam a um critério, como:
Get-Process | Where-Object { $_.WorkingSet64 -gt 500MB } | Stop-Process
Isso encerra todos os processos que estão usando mais de 500 MB de memória. Sempre teste em um ambiente controlado antes de executar em produção.
Start-Process
O cmdlet Start-Process é usado para iniciar um novo processo, seja um programa, um script ou um documento. Ele oferece várias opções, como definir argumentos, redirecionar saída, escolher o diretório de trabalho e até mesmo executar com privilégios elevados.
A sintaxe básica é:
Start-Process [-FilePath] <caminho> [-ArgumentList <argumentos>] [-WorkingDirectory <diretorio>] [-WindowStyle <estilo>]
Por exemplo, para abrir o Bloco de Notas:
Start-Process notepad
Para abrir um arquivo específico com o Bloco de Notas:
Start-Process notepad -ArgumentList "C:\meu_arquivo.txt"
Também é possível iniciar um processo em segundo plano, sem janela, usando -WindowStyle Hidden:
Start-Process -FilePath "C:\scripts\meu_script.ps1" -WindowStyle Hidden
Uma funcionalidade poderosa é a capacidade de aguardar a conclusão do processo com o parâmetro -Wait, o que é útil em scripts que dependem da conclusão de um programa.
Start-Process -FilePath "C:\temp\instalador.exe" -Wait
Além disso, podemos redirecionar a saída padrão e de erro para arquivos, facilitando a auditoria:
Start-Process -FilePath "C:\meu_app.exe" -RedirectStandardOutput "C:\logs\saida.txt" -RedirectStandardError "C:\logs\erro.txt"
Isso é especialmente útil para executar processos em scripts de automação.
Filtragem
Filtrar processos é essencial para selecionar apenas aqueles que atendem a critérios específicos, como uso de memória, nome, tempo de CPU ou estado. O PowerShell oferece o cmdlet Where-Object para filtrar objetos por propriedades, e também podemos usar o parâmetro -Filter em alguns cmdlets, mas o mais comum é usar Where-Object com Get-Process.
Por exemplo, para listar todos os processos que começam com "chrome" e estão usando mais de 100 MB de memória:
Get-Process -Name chrome* | Where-Object { $_.WorkingSet64 -gt 100MB }
Podemos filtrar por vários critérios, como processos que não respondem (estado "Not Responding"):
Get-Process | Where-Object { $_.Responding -eq $false }
Ou por tempo de CPU, por exemplo, processos que usaram mais de 10 minutos de CPU:
Get-Process | Where-Object { $_.CPU -gt 600 }
Outra técnica é usar o parâmetro -IncludeUserName para obter o nome do usuário que iniciou o processo, permitindo filtrar por usuário:
Get-Process -IncludeUserName | Where-Object { $_.UserName -eq 'DOMINIO\usuario' }
Combinando filtros, podemos criar consultas poderosas para monitoramento e automação. Lembre-se de que as propriedades dos objetos de processo são acessíveis via $_.NomeDaPropriedade dentro do bloco Where-Object.
Boas Práticas
Ao gerenciar processos, é importante ter cuidado para não encerrar processos críticos do sistema. Sempre verifique o impacto antes de usar Stop-Process. Use filtros precisos e, quando possível, teste em um ambiente de desenvolvimento. Além disso, documente seus scripts e inclua tratamento de erros para evitar falhas inesperadas.
Outra boa prática é usar o parâmetro -ErrorAction para controlar o comportamento quando um processo não é encontrado. Por exemplo, Stop-Process -Name "inexistente" -ErrorAction SilentlyContinue não exibe erro se o processo não existir.
Referências
- Documentação oficial do Get-Process no Microsoft Learn
- Documentação oficial do Stop-Process no Microsoft Learn
- Documentação oficial do Start-Process no Microsoft Learn
- Documentação oficial do Where-Object no Microsoft Learn
- Gerenciando processos com PowerShell (artigo)
Exercícios
-
Liste todos os processos que estão usando mais de 200 MB de memória (WorkingSet64).
✓ Resposta:Get-Process | Where-Object { $_.WorkingSet64 -gt 200MB } -
Encerre todos os processos chamados "chrome" que estejam respondendo normalmente, mas não force a finalização.
✓ Resposta:Get-Process -Name chrome | Where-Object { $_.Responding } | Stop-Process -
Inicie o Bloco de Notas com um arquivo chamado "C:\temp\exemplo.txt" e aguarde o processo terminar.
✓ Resposta:Start-Process notepad -ArgumentList "C:\temp\exemplo.txt" -Wait -
Liste os 5 processos que mais consomem memória, ordenados de forma decrescente, exibindo apenas Nome, PID e Memória.
✓ Resposta:Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 5 Name, Id, WorkingSet64 -
Encerre todos os processos que não estão respondendo (Responding = $false) e exiba uma mensagem de confirmação para cada um.
✓ Resposta:Get-Process | Where-Object { -not $_.Responding } | ForEach-Object { Stop-Process -Id $_.Id; Write-Host "Processo $($_.Name) (PID $($_.Id)) encerrado." }