Solved

Powershell script to kill process based on processor utilization

Posted on 2012-03-13
3
1,399 Views
Last Modified: 2012-04-12
I'm using this command to kill winword.exe processes on a server we have that uses MS Word for a document conversion process.  Because of a bug in this process, the winword.exe process is being left open when the conversion should close it after it completes.  Until a bug fix is released for the third-party app involved, I would like to devise a method to kill these processes.  I know I can use this power shell command:

stop-process -Name winword* -force

it works just fine.  However, I'd like to automate it if possible.  I was wonder if it would be possible to put this in a PowerShell script that will do the following:

1. run the stop-process command for winword.exe if a certain total processor threshold is crossed...let's say 75%.
2. close all winword.exe processes older than 2 minutes.
3. send an alert via email when script is run

I'm still learning pshell, and I know this is a little fancier than what I'm used to doing, so i was wondering if anyone had any ideas on how to accomplish these goals.

Thanks!
0
Comment
Question by:patriots
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 8

Expert Comment

by:Brent Challis
ID: 37718009
How do you want to define utilisation?  Is it per processor or per core?  Are you concerned with multi processor (as opposed to multi core) systems?
0
 
LVL 8

Accepted Solution

by:
Brent Challis earned 400 total points
ID: 37719075
Here is a function that test CPU utilisation and kill processes that have been running for longer than a defined time period:

function Kill-Process
{
    [CmdletBinding()]
    param
    (
        [string]$ProcessName="WinWord",
        [int]$UtilisationTheshold=75,
        [int]$ProcessAge=2
    )
    $cpuUtilisation = (Get-WMIObject win32_processor).LoadPercentage
    Write-Verbose $pu
    if ($cpuUtilisation -ge $UtilisationTheshold)
    {
        try
        {
            $processes = Get-Process $ProcessName
            foreach ($process in $processes)
            {
                $runningTime = ((Get-Date) - $process.StartTime).TotalMinutes
                if ($runningTime -ge $ProcessAge)
                {
                    $process | Stop-Process
                }  
            }
        }
        catch
        {
            Write-Verbose $_
        }
    }
    else
    {
        Write-Verbose "Utilisation under threshold $UtilisationTheshold"
    }
    Write-Verbose "Complete."
}

Kill-Process -verbose
0
 
LVL 69

Assisted Solution

by:Qlemo
Qlemo earned 100 total points
ID: 37734826
I agree with above solution, but would "improve" the code in the try block to make it more "powershellish":
Get-Process $ProcessName |
  ? { ((Get-Date)-$_.StartTime).TotalMinutes -ge $ProcessAge } |
  stop-process

Open in new window

0

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This article explains how to install and use the NTBackup utility that comes with Windows Server.
The following article is intended as a guide to using PowerShell as a more versatile and reliable form of application detection in SCCM.
This tutorial will walk an individual through the steps necessary to install and configure the Windows Server Backup Utility. Directly connect an external storage device such as a USB drive, or CD\DVD burner: If the device is a USB drive, ensure i…
This tutorial will walk an individual through the process of transferring the five major, necessary Active Directory Roles, commonly referred to as the FSMO roles to another domain controller. Log onto the new domain controller with a user account t…

733 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question