[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

Powershell script to kill process based on processor utilization

Posted on 2012-03-13
3
Medium Priority
?
1,488 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
  • 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 1600 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 71

Assisted Solution

by:Qlemo
Qlemo earned 400 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

Free recovery tool for Microsoft Active Directory

Veeam Explorer for Microsoft Active Directory provides fast and reliable object-level recovery for Active Directory from a single-pass, agentless backup or storage snapshot — without the need to restore an entire virtual machine or use third-party tools.

Question has a verified solution.

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

Previously, on our Nano Server Deployment series, we've created a new nano server image and deployed it on a physical server in part 2. Now we will go through configuration.
Auditing domain password hashes is a commonly overlooked but critical requirement to ensuring secure passwords practices are followed. Methods exist to extract hashes directly for a live domain however this article describes a process to extract u…
This tutorial will walk an individual through locating and launching the BEUtility application and how to execute it on the appropriate database. Log onto the server running the Backup Exec database. In a larger environment, this would generally be …
This tutorial will show how to configure a new Backup Exec 2012 server and move an existing database to that server with the use of the BEUtility. Install Backup Exec 2012 on the new server and apply all of the latest hotfixes and service packs. The…

834 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