Gestión de procesos con Powershell¶
La teoría para gestionar procesos ya se ha impartido en las secciones anteriores por lo que esta sección se centra en las herramientas y comandos para gestionar los procesos en PowerShell.
Nota
Para encontrar los comandos relacionados con procesos en Power-Shell podemos utilizar:
get-command *process*
PS /Users/aso> get-command *process*
CommandType Name Version Source
----------- ---- ------- ------
Alias Start-ASRSwitchProcessServerJob 5.2.0 Az.RecoveryServices
Cmdlet Debug-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Enter-PSHostProcess 7.2.2.500 Microsoft.PowerShell.Core
Cmdlet Exit-PSHostProcess 7.2.2.500 Microsoft.PowerShell.Core
Cmdlet Get-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Get-PSHostProcessInfo 7.2.2.500 Microsoft.PowerShell.Core
Cmdlet Start-AzRecoveryServicesAsrSwitchProcessServerJob 5.2.0 Az.RecoveryServices
Cmdlet Start-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Stop-Process 7.0.0.0 Microsoft.PowerShell.Management
Cmdlet Wait-Process 7.0.0.0 Microsoft.PowerShell.Management
Nota
Para obtener información de cada comando: Get-Help
PS /Users/aso> get-help Get-Process
NAME
Get-Process
SYNTAX
Get-Process [[-Name] <string[]>] [-Module] [-FileVersionInfo] [<CommonParameters>]
Get-Process [[-Name] <string[]>] -IncludeUserName [<CommonParameters>]
Get-Process -Id <int[]> [-Module] [-FileVersionInfo] [<CommonParameters>]
Get-Process -Id <int[]> -IncludeUserName [<CommonParameters>]
Get-Process -InputObject <Process[]> [-Module] [-FileVersionInfo] [<CommonParameters>]
Get-Process -InputObject <Process[]> -IncludeUserName [<CommonParameters>]
ALIASES
gps
REMARKS
Get-Help cannot find the Help files for this cmdlet on this computer. It is displaying only partial help.
-- To download and install Help files for the module that includes this cmdlet, use Update-Help.
-- To view the Help topic for this cmdlet online, type: "Get-Help Get-Process -Online" or
go to https://go.microsoft.com/fwlink/?LinkID=2096814.
Obtener procesos¶
Para obtener los procesos que se están ejecutando en el equipo local, se ejecuta Get-Process
sin parámetros.
PS /Users/aso> Get-Process
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0,00 24,09 31,56 406 1 accountsd
0 0,00 8,14 0,48 488 1 adprivacyd
0 0,00 8,18 0,41 475 1 AirPlayUIAgent
0 0,00 11,19 2,09 425 1 akd
0 0,00 4,88 0,17 453 1 AMPDeviceDiscov
0 0,00 7,43 0,50 590 1 AMPLibraryAgent
0 0,00 9,42 1,02 480 1 amsaccountsd
0 0,00 10,34 2,69 410 1 amsengagementd
0 0,00 1,68 0,03 500 1 APFSUserAgent
0 0,00 28,80 28,01 600 1 AppleSpell
0 0,00 9,23 0,44 398 1 AppSSOAgent
0 0,00 11,14 5,90 538 1 appstoreagent
0 0,00 8,06 0,73 472 1 askpermissiond
0 0,00 6,64 0,42 566 1 AssetCacheLocat
0 0,00 22,21 12,86 483 1 assistantd
0 0,00 22,71 9,10 718 1 assistant_servi
0 0,00 3,09 0,28 605 1 AudioComponentR
0 0,00 24,00 0,47 1273 1 avatarsd
0 0,00 5,79 0,18 386 1 backgroundtaskm
0 0,00 8,36 1,92 418 1 bird
Nota
- En la salida del comando anterior hay mucha información desordenada a analizar.
- Puede ayudar a ver la información si se organizan los procesos de mayor a menor consumo de CPU, y solo los 10 primeros.
PS /Users/aso> Get-Process|Sort-Object CPU -Descending|Select-Object -First 10
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0,00 52,24 643,87 561 1 suggestd
0 0,00 23,55 267,14 457 1 CleanMyMac X He
0 0,00 26,21 262,25 912 912 CalendarWidgetE
0 0,00 32,32 210,93 407 1 CalendarAgent
0 0,00 32,07 181,48 914 914 WorldClockWidge
0 0,00 95,39 140,45 378 1 Finder
0 0,00 586,70 135,40 5266 1 Code Helper
0 0,00 221,30 127,45 5031 1 Code Helper (Re
0 0,00 17,03 94,25 390 390 QuickLookUIServ
0 0,00 114,68 93,64 5049 1 Safari
- En el supuesto caso que se quieran encontrar determinados procesos se pueden obtener especificando sus nombres de proceso o identificadores de proceso.
Ejemplo
El siguiente comando obtiene el proceso inactivo: Get-Process -id 0
Nota
El proceso inactivo del sistema contiene uno o más kernel threads que ejecuta cuando ningún otro thread puede ser planificado en la CPU, es decir, es el porcentaje que el procesador no está trabajando.
PS /Users/aso> Get-Process -id 0
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
0 0 0 16 0 0 Idle
Nota
- Es normal que los cmdlets no devuelvan datos en algunas situaciones, como por ejemplo cuando se especifica un proceso por su id de proceso
Get-Process
y si no encuentra ninguna coincidencia generará un error, porque la intención habitual consiste en recuperar un proceso en ejecución conocido. - Si no hay ningún proceso con ese identificador, es probable que el identificador sea incorrecto o que el proceso de interés haya terminado.
PS /Users/aso> Get-Process -Id 99
Get-Process : No process with process ID 99 was found.
At line:1 char:12
+ Get-Process <<<< -Id 99
Consejo
- Para evitar estos errores puede usar el parámetro
Name
del cmdletGet-Process
para especificar un subconjunto de procesos basado en el nombre del proceso. - El parámetro
Name
puede tomar varios nombres de una lista de nombres separados por comas y admite el uso de caracteres comodín, para que pueda escribir patrones de nombre.
Example
El siguiente comando obtiene el proceso cuyos nombres comienzan por "ex".
PS /Users/aso> Get-Process -Name ex*
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
234 7 5572 12484 134 2.98 1684 EXCEL
555 15 34500 12384 134 105.25 728 explorer
Get-Process
también acepta varios valores para el parámetro Name.
PS /Users/aso> Get-Process -Name exp*,power*
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
540 15 35172 48148 141 88.44 408 explorer
605 9 30668 29800 155 7.11 3052 powershell
- Para obtener más información de un proceso se puede utilizar el comando:
PS /Users/aso> Get-Process -Name pwsh |Format-List *
Name : pwsh
Id : 5289
PriorityClass : Normal
FileVersion :
HandleCount : 0
WorkingSet : 85704704
PagedMemorySize : 0
PrivateMemorySize : 0
VirtualMemorySize : -1759395840
TotalProcessorTime : 00:00:21.8087752
SI : 5289
Handles : 0
VM : 6830538752
WS : 85704704
PM : 0
NPM : 0
Path : /usr/local/microsoft/powershell/7/pwsh
CommandLine :
Parent : System.Diagnostics.Process (Code Helper (Re)
Company :
CPU : 21,8248627
ProductVersion :
Description :
Product :
__NounName : Process
SafeHandle : Microsoft.Win32.SafeHandles.SafeProcessHandle
Handle : 1336
BasePriority : 0
Obtener información determinada de un proceso¶
Para obtener informaciones en particular de un proceso podemos poner entre paréntesis el comando de obtener el proceso y a continuación un punto seguido de la información que se quiera obtener. Por ejemplo:
- Una información importante de un proceso puede ser el path donde esta guardado el proceso, y se puede obtener con:
PS /Users/aso> (Get-Process -Name pwsh).path
/usr/local/microsoft/powershell/7/pwsh
- Para obtener el tamaño del proceso con:
PS /Users/aso> (Get-Process -Name pwsh).ws 68603904
Procesos en remoto¶
- Puede usar el parámetro ComputerName de
Get-Process
para obtener procesos en equipos remotos. Por ejemplo, el comando siguiente obtiene los procesos de PowerShell en el equipo local (representado por "localhost") y en dos equipos remotos.
Get-Process -Name PowerShell -ComputerName localhost, Server01, Server02
- La salida de este comando seria:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
258 8 29772 38636 130 3700 powershell
398 24 75988 76800 572 5816 powershell
605 9 30668 29800 155 7.11 3052 powershell
Nota
- Los nombres de equipo no son evidentes en este resultado, pero se almacenan en la propiedad MachineName de los objetos de proceso que devuelve
Get-Process
. - El siguiente comando usa el cmdlet
Format-Table
para mostrar el identificador de proceso y las propiedades ProcessName y MachineName(ComputerName) de los objetos de proceso.
Get-Process -Name PowerShell -ComputerName localhost, Server01, Server01 |
Format-Table -Property ID, ProcessName, MachineName
- La salida de este comando seria:
Id ProcessName MachineName
-- ----------- -----------
3700 powershell Server01
3052 powershell Server02
5816 powershell localhost
Detener procesos¶
- El cmdlet
Stop-Process
toma un nombre o un identificador para especificar un proceso que quiere detener. Su capacidad para detener procesos dependerá de sus permisos. Algunos procesos no se pueden detener. Por ejemplo, si intenta detener el proceso inactivo, obtendrá un error:
Stop-Process -Name Idle
- La salida de este comando seria:
Stop-Process : Process 'Idle (0)' cannot be stopped due to the following error:
Access is denied
At line:1 char:13
+ Stop-Process <<<< -Name Idle
Consejo
- También puede forzar la solicitud con el parámetro
Confirm
. - Este parámetro es especialmente útil si se usa un carácter comodín al especificar el nombre del proceso, ya que accidentalmente podría coincidir con algunos procesos que no se quiere detener:
Stop-Process -Name t*,e* -Confirm
- La salida de este comando seria:
Confirm
Are you sure you want to perform this action?
Performing operation "Stop-Process" on Target "explorer (408)".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
(default is "Y"):n
Confirm
Are you sure you want to perform this action?
Performing operation "Stop-Process" on Target "taskmgr (4072)".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
(default is "Y"):n
Detención de procesos que no responden¶
Consejo
- La manipulación de procesos complejos es posible si se usan algunos cmdlets de filtrado de objetos.
- Dado que un objeto Process tiene una propiedad Responding que es
false
cuando ya no responde, puede detener todas las aplicaciones que no respondan con el comando siguiente:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
Detener procesos en remoto¶
El cmdlet Stop-Process
no tiene un parámetro ComputerName. Por lo tanto, para ejecutar un comando para detener un proceso en un equipo remoto, debe usar el cmdlet Invoke-Command
. Por ejemplo, para detener el proceso de PowerShell en el equipo remoto Server01, escriba:
Invoke-Command -ComputerName Server01 {Stop-Process Powershell}
Detener todas las demás sesiones de Windows PowerShell¶
-
En ocasiones puede ser útil poder detener todas las sesiones de Windows PowerShell que se están ejecutando, excepto la sesión actual. Si una sesión usa demasiados recursos o es inaccesible (quizás se esté ejecutando de forma remota o en otra sesión de escritorio), es posible que no pueda detenerla directamente. Si intenta detener todas las sesiones que se están ejecutando, la sesión actual podría finalizar en su lugar.
-
Cada sesión de Windows PowerShell tiene un PID de variable de entorno que contiene el identificador del proceso de Windows PowerShell. Puede comprobar el $PID con el identificador de la sesión actual y finalizar solo las sesiones de Windows PowerShell que tengan un identificador diferente. El siguiente comando de canalización realiza esta acción y devuelve la lista de las sesiones finalizadas (debido al uso del parámetro
PassThru
):
Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} |
Stop-Process -PassThru
- La salida de este comando seria:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
334 9 23348 29136 143 1.03 388 powershell
304 9 23152 29040 143 1.03 632 powershell
302 9 20916 26804 143 1.03 1116 powershell
335 9 25656 31412 143 1.09 3452 powershell
303 9 23156 29044 143 1.05 3608 powershell
287 9 21044 26928 143 1.02 3672 powershell
Iniciar procesos¶
Se pueden iniciar procesos conociendo el path de su ejecutable. Por Ejemplo:
PS /Users/aso> Start-Process -FilePath C:\windows\notepad.exe
Consejo
Para abrir aplicaciones se utilizaría un comando parecido pero hay que realizar a través de un protocolo. Ejemplo, si se quisiera abrir el Edge de Windows:
PS /Users/aso> Start-Process Microsoft-edge://
Actividades¶
NOTA
Escribe el código de los scripts en PowerShell que se detallan en cada ejercicio. Deberás crear un fichero de texto para cada ejercicio con el siguiente nombre: ejXXX.sh, donde las X representan el número de ejercicio. Una vez terminada la práctica, comprime todos estos ficheros en uno y súbelos al Moodle.
- Realiza un script en PowerShell que realice los siguientes puntos:
- Cuenta el número de procesos en ejecución en el sistema, y los muestre por pantalla.
- Ver que programas se ejecutan en el inicio de sesión y los muestre por pantalla.
- Guardar los un listado de los procesos en un csv e Imprima por pantalla el archivo.
- Realiza un script en PowerShell que realice los siguientes puntos:
- Lista los procesos que tengan un alto consumo de CPU.
- Detenga el proceso con mayor consumo.
- Mostrar los procesos cuya zona de memoria para trabajar sea mayor que 100 MB y a continuación los detenga.