Powershell script to kill process based on processor utilization

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!
patriotsAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Brent ChallisPrincipal: ITCommented:
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
Brent ChallisPrincipal: ITCommented:
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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
QlemoBatchelor, Developer and EE Topic AdvisorCommented:
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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Powershell

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.