Jump to content

Check for Running Service


Recommended Posts

Hi, i need a way of checking if a service is running. Is their a way of doing this as i want to include this check in an if statment for an installer. I cant seem to find anything on services in the help file? Am i just not looking hard enough?

Link to post
Share on other sites

Thanks guys thats briliant. WHat i need to be able to do is query whether an SQL service is running (MSSQL$TT). I want to use the status of the service in an if statment, e.g. if state = running then ... else ...

Any ideas??

Just query for sql. SC is a command line tool to see what the installed services are doing. You can also use a vbscript with WMI to do this.

Here's a function that can be used to do this..........

Function ProcList

Dim objWMIService, objProcess, colProcess

Dim strComputer, strList, fso, f

Set fso = createobject("Scripting.FileSystemObject")

Set f = fso.createTextFile("c:\process.txt", True)

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _

& "{impersonationLevel=impersonate}!\\" _

& strComputer & "\root\cimv2")

Set colProcess = objWMIService.ExecQuery _

("Select * from Win32_Process")

For Each objProcess in colProcess

strList = strList & _

objProcess.Name & VbCrLf

Next

f.writeLine strList

f.close

End Function

Link to post
Share on other sites

Thanks for your reply, im sorry im sure it works and all but i cant seem to figure out what i am going to do with that code!! Im still new to autoit and love it so i am really keen to learn more so i would appriciate some more help!!

Link to post
Share on other sites

Thanks for the PMs. I will show the breakdown of handling the strings returned so you can use it if preferable.

$pid = Run('sc query dhcp', '', @SW_HIDE, 2)

Global $data

Do
    $data &= StdOutRead($pid)
Until @error

$data = StringSplit($data, @CRLF, 1)
If Not @error Then
    For $i = 1 To $data[0]
        ; Strip all whitespace
        $data[$i] = StringStripWS($data[$i], 8)
        If $data[$i] = '' Then
            ; Skip empty lines
            ContinueLoop
        ElseIf StringLeft($data[$i], 5) <> 'STATE' Then
            ; Skip lines that include no state
            ContinueLoop
        Else
            ; Remove "STATE:" and trim integer code
            $data[$i] = StringTrimLeft(StringReplace($data[$i], 'STATE:', ''), 1)
        EndIf
        ; Show compare to RUNNING and show result if True
        If $data[$i] = 'RUNNING' Then
            MsgBox(0, '', $data[$i])
        EndIf
    Next
EndIf

Yeah, as rmarino shows, WMI is available also. :P

Link to post
Share on other sites

many ways:

$service = "dhcp"
MsgBox(0, $service, _RetrieveServiceState(@ComputerName, $service))

Func _RetrieveServiceState($s_Machine, $s_ServiceName)
    Local Const $wbemFlagReturnImmediately = 0x10
    Local Const $wbemFlagForwardOnly = 0x20
    Local $colItems = "", $objItem
    Local $objWMIService = ObjGet("winmgmts:\\" & $s_Machine & "\root\CIMV2")
    If @error Then
        MsgBox(16, "_RetrieveServiceState", "ObjGet Error: winmgmts")
        Return
    EndIf
    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_Service WHERE Name = '" & $s_ServiceName & "'", "WQL", _
            $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If @error Then
        MsgBox(16, "_RetrieveServiceState", "ExecQuery Error: SELECT * FROM Win32_Service")
        Return
    EndIf
    If IsObj($colItems) Then
        For $objItem In $colItems
            Return $objItem.State
        Next
    EndIf
EndFunc   ;==>_RetrieveServiceState
Edited by gafrost

SciTE for AutoItDirections for Submitting Standard UDFs

 

Don't argue with an idiot; people watching may not be able to tell the difference.

 

Link to post
Share on other sites
  • 3 years later...

Try this for an idea. Services have been covered in great amounts on the forum. Search is your friend.

$pid = Run('sc query dhcp', '', @SW_HIDE, 2)

Global $data

Do
    $data &= StdOutRead($pid)
Until @error

If StringInStr($data, 'running') Then
    MsgBox(0, 'Running', $data)
Else
    MsgBox(0, 'Not Running', $data)
EndIf

;)

Hi,

Thank you for the script.

I run 2 MySQL services on Windows XP, and ProcessExists can't tell which mysqld-nt.exe is running.

Your script is exactly what I'm looking for. :)

Link to post
Share on other sites
  • 3 months later...

Greetings!,

I am relatively new to AuoIT so hope this doesn't sound like dumb question. I have below script and it works fine when I run once but I want it to run continuously to monitor the service and alert me when service goes down. The script also starts the service back up. Again a very noob question but how do I run this script in a continuous loop. Thanks.

Code Below:

-------------------------------------------------------------------------

#include <smtp.au3>

$GmailUser = "blah1@gmail.com"

$GmailPass = "12345678"

$ToEmail = "blah2@gmail.com"

$pc = @ComputerName

$service = "PeerDistSvc";BranchCache service

$pid = Run('sc query PeerDistSvc', '', @SW_HIDE, 2)

Global $data

Do

$data &= StdoutRead($pid)

Until @error

If StringInStr($data, 'running') Then

Else

RunWait(@ComSpec & " /c " & "sc \\" & $pc & " start " & $service, "", @SW_HIDE)

_INetSmtpMailCom("smtp.gmail.com", @ComputerName, $ToEmail, $ToEmail, $GmailUser, $GmailPass, "Service " & $service & " is down", "Service is down")

EndIf

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...