I wanted a process to be always running, so why not make a PowerShell Process Monitor for that?

The idea was to create a never ending script, to look for the process, and if it shutdown for what so ever reason, it should start it again.

The script is fairly simple. We use a While ($true) to make our never ending loop, in that we have a if() else() statement, to handle if the process is running or not.

 

How to use the PowerShell Process Monitor

Use this script on your own risk!
  1. Copy the script below and save it as Start-ProcessMonitor.ps1
  2. Run it with the following parameters -ProcessName  and -FilePath
  3. For my test i used TeamViewer
    Start-ProcessMonitor.ps1 -ProcessName TeamViewer -FilePath ‘C:\Program Files (x86)\TeamViewer’
    -ProcessName  is the name of the EXE file to monitor, without the .EXE file extention, eg. TeamViewer (for TeamViewer.exe)
    -FilePath  is the path to where the EXE file is located, eg. C:\Program Files (x86)\TeamViewer
  4. If you see the error ‘Start-ProcessMonitor.ps1 cannot be loaded because running scripts is disabled on this system‘, you need to change your ExecutionPolicy.
    Check it with Get-ExecutionPolicy . In order to run my script it need to be RemoteSigned, Unrestricted or ByPass. RemoteSigned is recommended.
    TIP: You can run this in a Restricted situation, if you just use the -ExectuinPolicy RemoteSigned  as a parameter:
    PowerShell.exe -ExecutionPolicy RemoteSigned -File Start-ProcessMonitor.ps1 -ProcessName TeamViewer -FilePath ‘C:\Program Files (x86)\TeamViewer’
  5. In the same path as the Start-ProcessMonitor.ps1, you will also find a log file, where a line is added for every time the script has started the process for you.

 

The script

Save this as Start-ProcessMonitor.ps1

#requires -Version 2
<#
    .SYNOPSIS
    Monitor a process, and keep it running!
    
    .DESCRIPTION
    We want to monitor a specefic process, and then be able to start it, if it is not running.
    
    .PARAMETER ProcessName
    Enter the name of the process to monitor, with out the .exe extention

    .PARAMETER FilePath
    Path to the ProcessName file to monitor.
    
    .EXAMPLE
    Start-ProcessMonitor.ps1 -ProcessName CMD -FilePath "C:\Windows\System32"
    Will Launch and monitor the command prompt CMD
        
    .NOTES
    File Name: Start-ProcessMonitor.ps1
    Author: Christian Tukjær Nyhuus - [email protected]
    Requires: PowerShell V2
#>
[CmdletBinding()]
param
(
  [Parameter(Mandatory = $true, Position = 0)]
  [System.String]
  $ProcessName = '',
    
  [Parameter(Mandatory = $true, Position = 1)]
  [System.String]
  $FilePath = ''
) 

# Running a neverending loop, because $true will always be $true
while ($true)
{
  If(!(Get-Process -Name $ProcessName -ErrorAction SilentlyContinue))
  {
    # Setting timestamp for the log message
    $TimeStamp = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
    # Generating the path for the log file, using the currently invoked location and file name, and add .log to the end of it.
    $LogPath = "$($PSScriptRoot)\$($MyInvocation.MyCommand.Name)-$($ProcessName).log"
    # Generating the message to add to the log file
    $LogMessage = "$($TimeStamp): NOT RUNNING: $($ProcessName)... Launching it..."
    # Adding the message to the log file.
    Add-Content -Path $LogPath -Value $LogMessage
  
    # Starting Process
    Start-Process -FilePath "$($FilePath)\$($ProcessName).exe"
    
    # Sleeping the loop for 5 secs, to let the process start.
    Start-Sleep -Seconds 5
  }
  Else
  {   
    # Sleeping the loop for 5 secs, to not max out the CPU
    Start-Sleep -Seconds 5
  }
}