Determining if a process is running

user3013729 picture user3013729 · Dec 3, 2013 · Viewed 9.8k times · Source

all,

I am new to Power Shell scripting and my second script is not working 100%. I am not sure what is going on.

Purpose:

  1. Check to see if a specific process is running or not.
  2. If it is running, send an email advising.
  3. If it is not running, attempt to start the process.
  4. If attempting to start the process, recheck to see if process started or not.

Issue:

  • If I change the directory location of the script (to make sure it is wrong), I get the right email.
  • If the process is running, I get the right email.
  • If the process is not running, the script starts the process correctly, but sends and email saying the process is not running when in fact it is running.

Script:

# Date and Date/Time stamping for files and logs.
$FileDateTimeStamp = get-date -uformat "%m%d%Y-%H%M%S"
$FileDateStamp = get-date -uformat "%m%d%Y"

# Logs directory.
$LogsDirectory = "C:\logs\"

# AS2 file information.
$AS2 = "C:\Program Files\nsoftware\AS2 Connector V2\as2app\bin\nsoftware.AS2Connector.exe"
$AS2ParentDirectory = "C:\Program Files\nsoftware\AS2 Connector V2"
$ProcessNameToCheck = "nsoftware.AS2Connector"
$ProcessIsRunning = Get-Process $ProcessNameToCheck -ErrorAction SilentlyContinue
$StartTheProcess = start-process -filepath $AS2
$SleepTime = 2

# Exchange information for sending emails.
$EmailServer = "email.me.com"
$EmailFrom = "[email protected]"
$AuthUser = "username"
$AuthPass = "password"
$EmailPort = 25
$MaxRetries = 1

# Blat log file location/name.
$BlatLogFile = $LogsDirectory + "BlatLog-" + $FileDateStamp + ".log"

# Blat information.
#$EmailTo = "[email protected],[email protected],[email protected]"
$EmailTo = "[email protected]"
$EmailToSubjectSuccess = "AS2 Connector is running."
$EmailToBodySuccess = "The process check for AS2 Connector on OSPC was successful. AS2 Connector is running."
$EmailToSubjectFail = "AS2 Connector is NOT running."
$EmailToBodyFail = "The process check for AS2 Connector on OSPC was unsuccessful. Attempted to start the application which was also unsuccessful. AS2 Connector is NOT currently running on OSPC."
$EmailToSubjectNotInstalled = "AS2 Connector Installation Not Found."
$EmailToBodyNotInstalled = "The process check for AS2 Connector on OSPC failed because AS2 Connector does not seem to be installed."
$XHeaderInfo = "Email sent from OSPC"

function WriteLogFile {
    #Code snippet obtained from: http://poshcode.org/2566

    [cmdletbinding()]
    Param(
        [Parameter(ValueFromPipeline=$true,Mandatory=$true)] [ValidateNotNullOrEmpty()]
        [string] $Message,

        [Parameter()] [ValidateSet(“Error”, “Warn”, “Info”)]
        [string] $Level = “Info”,

        [Parameter()] [ValidateRange(1,30)]
        [Int16] $Indent = 0,

        [Parameter()]
        [IO.FileInfo] $ScriptLogFile = $LogsDirectory + "ScriptLog-" + $FileDateStamp + ".log",

        [Parameter()]
        [Switch] $Clobber,

        [Parameter()]
        [String] $EventLogName,

        [Parameter()]
        [String] $EventSource = ([IO.FileInfo] $MyInvocation.ScriptName).Name,

        [Parameter()]
        [Int32] $EventID = 1
    )

    Begin {}

    Process {
        try {           
            $msg = '{0}{1} : {2} : {3}' -f (" " * $Indent), (Get-Date -Format “yyyy-MM-dd HH:mm:ss”), $Level.ToUpper(), $Message

            switch ($Level) {
                'Error' { Write-Error $Message }
                'Warn' { Write-Warning $Message }
                'Info' { Write-Host ('{0}{1}' -f (" " * $Indent), $Message) -ForegroundColor White}
            }

            if ($Clobber) {
                $msg | Out-File -FilePath $ScriptLogFile
            } else {
                $msg | Out-File -FilePath $ScriptLogFile -Append
            }

            if ($EventLogName) {
                if(-not [Diagnostics.EventLog]::SourceExists($EventSource)) { 
                    [Diagnostics.EventLog]::CreateEventSource($EventSource, $EventLogName) 
                } 
                $log = New-Object System.Diagnostics.EventLog  
                $log.set_log($EventLogName)  
                $log.set_source($EventSource) 

                switch ($Level) {
                    “Error” { $log.WriteEntry($Message, 'Error', $EventID) }
                    “Warn”  { $log.WriteEntry($Message, 'Warning', $EventID) }
                    “Info”  { $log.WriteEntry($Message, 'Information', $EventID) }
                }
            }
        } catch {
            throw “Failed to create log entry in: ‘$ScriptLogFile’. The error was: ‘$_’.”
        }
    }

    End {}
}

if (test-path $AS2ParentDirectory) {
    # AS2 is installed on this machine.
    # Check for the running process.
    if (!($ProcessIsRunning)) {
        # Process is not found = not runing.
        # Try to start the process.
        # Once start attempt is complete, recheck to make sure failed or succeeded.
        # Failed: send an alert email through blat.
        # Succeeded: Send an alert email through blat.
        write-host "AS2 Connector is not running. Attempting to start."
        WriteLogFile -message "Script Line #142: AS2 Conenctor is not running. Attempting to start." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        $StartTheProcess

        # Give the process a little time to start before checking. Wait X seconds.
        write-host "Going to sleep for $SleepTime seconds."
        WriteLogFile -message "Script Line #147: Going to sleep for $SleepTime seconds." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        start-sleep -s $SleepTime

            # Now, let's go ahead and recheck to see if the process started or not.
            if (!($ProcessIsRunning)) {
                # Process did not start successfully.
                write-host "AS2 Connector did not start successfully. Sending an email to advise."
                WriteLogFile -message "Script Line #162: AS2 Conenctor did not start successfully. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
                WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
                WriteLogFile -message "Email Subject: $EmailToSubjectFail" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
                WriteLogFile -message "Email Body: $EmailToBodyFail" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
                C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectFail -i $EmailFrom -body $EmailToBodyFail -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo
            } else {
                # Process started successfully.
                write-host "AS2 Connector started successfully. Sending an email to advise."
                WriteLogFile -message "Script Line #154: AS2 Conenctor started successfully. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
                WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
                WriteLogFile -message "Email Subject: $EmailToSubjectSuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
                WriteLogFile -message "Email Body: $EmailToBodySuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
                C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectSuccess -i $EmailFrom -body $EmailToBodySuccess -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo            
            }
    } else {
        # Process is found = running.
        # Send an email advising of running status.
        write-host "Verified AS2 Connector is running. Sending an email to advise."
        WriteLogFile -message "Script Line #130: Verified AS2 Conenctor is running. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        WriteLogFile -message "Email Subject: $EmailToSubjectSuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        WriteLogFile -message "Email Body: $EmailToBodySuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectSuccess -i $EmailFrom -body $EmailToBodySuccess -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo
    }
} else {
    # AS2 is not installed on this machine.
    # Send an email advising that there is a potential problem.
    write-host "AS2 Connector does not seem to be installed or is corrupt. Sending an email to advise."
    WriteLogFile -message "Script Line #173: AS2 Conenctor does not seem to be installed or is corrupt. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
    WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
    WriteLogFile -message "Email Subject: $EmailToSubjectNotInstalled" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
    WriteLogFile -message "Email Body: $EmailToBodyNotInstalled" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
    C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectNotInstalled -i $EmailFrom -body $EmailToBodyNotInstalled -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo
}

The portion of code that is going wrong is:

    # Now, let's go ahead and recheck to see if the process started or not.
    if (!($ProcessIsRunning)) {
        # Process did not start successfully.
        write-host "AS2 Connector did not start successfully. Sending an email to advise."
        WriteLogFile -message "Script Line #162: AS2 Conenctor did not start successfully. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        WriteLogFile -message "Email Subject: $EmailToSubjectFail" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        WriteLogFile -message "Email Body: $EmailToBodyFail" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectFail -i $EmailFrom -body $EmailToBodyFail -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo
    } else {
        # Process started successfully.
        write-host "AS2 Connector started successfully. Sending an email to advise."
        WriteLogFile -message "Script Line #154: AS2 Conenctor started successfully. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        WriteLogFile -message "Email Subject: $EmailToSubjectSuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        WriteLogFile -message "Email Body: $EmailToBodySuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
        C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectSuccess -i $EmailFrom -body $EmailToBodySuccess -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo            
    }

Answer

Frode F. picture Frode F. · Dec 3, 2013
$ProcessIsRunning = Get-Process $ProcessNameToCheck -ErrorAction SilentlyContinue
$StartTheProcess = start-process -filepath $AS2

When you run these lines, the commands are executed immediately, and the result is stored in the variable. So if the process was not running at the beginning of the script, $ProcessIsRunning will always be null (not running).

The solution is to remove both lines at the top, and replace every instance of the following variables below in your script:

  • $ProcessIsRunning with (Get-Process $ProcessNameToCheck -ErrorAction SilentlyContinue). Ex. if(!(Get-Process $ProcessNameToCheck -ErrorAction SilentlyContinue)) { "not running" } else { "running" }.

  • $StartTheProcess with Start-Process -Filepath $AS2

You could also try this approach, which is probably what you original plan was:

$ProcessIsRunning = { Get-Process notepad -ErrorAction SilentlyContinue }
$StartTheProcess = { Start-Process notepad }

#Run the start-process command
$StartTheProcess.Invoke()

#This will run the get-process command whenever you call it by using the Invoke() method.
if(!$ProcessIsRunning.Invoke()) {
    "Not running"
} else {
    "Running"
}

Ouput:

Running