Powershell: Script para matar procesos Windows enlazados
Hoy vamos a explicar un script de Powershell, que nos permite matar un proceso que se queda colgado al cerrar otro.
En este caso, java.exe no se cierra al cerrar la aplicación que lo llama. Esto es un problema de desarrollo, pero mientras me lo arreglan, yo puedo ir arreglando estos problemas, que en infraestructuras Citrix o VMware hace que procesos que no deberían estar en memoria, sigan por el fin de los días si no los matamos o cerramos las sesiones periódicamente:
GITHUB: https://gist.github.com/raulunzue/73780a21ddacbb170621cbd20f7892a6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# RAUL UNZUE - ELBLOGDENEGU # https://www.maquinasvirtuales.eu/powershell-script-para-matar-procesos-windows-enlazados/ # Revisar si existen en el sistema dos procesos java.exe y acslaunch_win-32 # SABER EL USUARIO $usuario=C:\windows\system32\whoami.exe # ELIMINAR DOMINIO $usuariomodificado=$usuario.Substring(5) # EXTRAER USUARIO, SESION ID Y PROCESOS ASOCIADOS AL USUARIO Get-Process -IncludeUserName | Select-Object Username,SessionID | Where-Object { $_.UserName -ne $null -and $_.UserName.Equals("NEGU\$usuariomodificado") } Get-Process -IncludeUserName | Select-Object UserName,SessionId,ProcessName | Where-Object { $_.UserName -ne $null -and $_.UserName.Equals("NEGU\$usuariomodificado") } | Set-Content C:\Users\$usuariomodificado\Desktop\proceso1.txt Get-Process -IncludeUserName | Select-Object UserName,SessionId,ProcessName | Where-Object { $_.UserName -ne $null -and $_.UserName.Equals("NEGU\$usuariomodificado") } | Set-Content C:\Users\$usuariomodificado\Desktop\proceso2.txt # BUSCAMOS CADENA DE TEXTO (Get-Content C:\Users\$usuariomodificado\Desktop\proceso1.txt) | Select-String -Pattern "acslaunch_win-32" | foreach {$_.Matches} | Set-Content C:\Users\$usuariomodificado\Desktop\proceso1.txt (Get-Content C:\Users\$usuariomodificado\Desktop\proceso2.txt) | Select-String -Pattern "java" | foreach {$_.Matches} | Set-Content C:\Users\$usuariomodificado\Desktop\proceso2.txt # Limpiamos los espacios en blanco y exportamos a TXT (Get-Content C:\Users\$usuariomodificado\Desktop\proceso1.txt) | ? {$_.trim() -ne "" } | Set-Content C:\Users\$usuariomodificado\Desktop\proceso1.txt (Get-Content C:\Users\$usuariomodificado\Desktop\proceso2.txt) | ? {$_.trim() -ne "" } | Set-Content C:\Users\$usuariomodificado\Desktop\proceso2.txt # PASAMOS RESULTADO A VARIABLE PARA TRATARLO $sesion=Get-Content C:\Users\elblogdenegu\Desktop\proceso1.txt $sesion2=Get-Content C:\Users\elblogdenegu\Desktop\proceso2.txt # MATAMOS PROCESO SI ES NECESARIO if ($sesion -eq "acslaunch_win-32") { #echo "Existe acslaunch_win-32.exe en la sesión de $usuariomodificado, no matamos java" # LOG $date=Get-Date Write-Output "$date - Existe acslaunch_win-32.exe en la sesión de $usuariomodificado, no matamos java" > C:\Scripts\matar-java-as400.log } else { if ($sesion2 -eq "java") { #echo "No existe acslaunch_win-32.exe en la sesión de $usuariomodificado, matamos java.exe" # LOG $date=Get-Date Write-Output "$date - No existe acslaunch_win-32.exe en la sesión de $usuariomodificado, matamos java.exe" > C:\Scripts\matar-java-as400.log # MATAR PROCESO Get-Process -Name java | Stop-Process -Force } else { #echo "No existe java tampoco en la sesión de $usuariomodificado, no matamos procesos" # LOG $date=Get-Date Write-Output "$date - No existe acslaunch_win-32 ni java en la sesión de $usuariomodificado, no matamos procesos" > C:\Scripts\matar-java-as400.log } } # BORRAR FICHEROS Remove-Item C:\Users\$usuariomodificado\Desktop\proceso1.txt Remove-Item C:\Users\$usuariomodificado\Desktop\proceso2.txt |
Podéis programar este script periódicamente, por ejemplo cada x minutos para limpiar los sistemas de procesos innecesarios.
¿Te ha gustado la entrada SÍGUENOS EN TWITTER?
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?