So, hallo zusammen. 
Jetzt mal zum Rekapitulieren mcbaldrian, ob ich richtig liege. So ganz klar ist das aus deinen Formulierungen nicht wirklich. Kann sehr gut sein dass ich falsch liege, aber mal sehen. 
Du hast einen Dienst. Dieser ist in AutoIt gescriptet und befindet sich als Quellcode in deinem Startpost. Korrekt?
So. Dann wollen wir uns den mal vorknöpfen.
;INI auslesen die im Scriptverzeichniss liegt
;Forschleife die alle 30 Secunden durchläuft und und die Jobs abarbeitet.###############################################
if ProcessExists("cceWork.exe") Then ;Der zu überwachende Prozess
$ProgPath = StringTrimRight(@ScriptDir,"8")
ShellExecute($ProgPath & "\QueueWatch.exe","","","",@SW_SHOW)
;Run("notepad.exe", "" ,@SW_MINIMIZE)
FileWriteLine(@ScriptDir & "\log.txt", @error & " " & " " & $ProgPath & "\QueueWatch.exe" & " " & @CRLF)
Sleep(30100) ; 30,100 Sekunden
;Forschleife die alle 30 Secunden durchläuft und und die Jobs abarbeitet.###############################################
Alles anzeigen
Meiner Meinung nach braucht es keinen einzigen dieser Includes. File.au3 brauchst du nur bei Funktionen die mit _File... beginnen (sogenannte UDFs / benutzerdefinierte Funktionen, die nicht standardmäßig in AutoIt eingebaut sind.) Array.au3 nur bei _Array...-Funktionen, und bei String dasselbe.
So. Dann muss ich erstmal deine seltsam anmutende For-Schleife anmaulen.
Anstatt eine For-Schleife zu basteln, die von 0 bis 2880 zählt, und die Zählervariable im For-Block irgendwann wieder auf 0 zurücksetzt... da kannst du gleich von 0 auf 100 zählen und i jedes mal auf 0 setzen
Scherz beiseite, im Ernst: Du machst eine While-Schleife. Das Ding soll ja wohl eh in Endlosschleife laufen. Sähe so aus:
if ProcessExists("cceWork.exe") Then
$ProgPath = StringTrimRight(@ScriptDir,"8")
ShellExecute($ProgPath & "\QueueWatch.exe","","","",@SW_SHOW)
FileWriteLine(@ScriptDir & "\log.txt", @error & " " & " " & $ProgPath & "\QueueWatch.exe" & " " & @CRLF)
So. cceWork.exe scheint also der Prozess zu sein auf dessen Existenz du prüfen willst. Der if-Block wird allerdings nur alle 30 Sekunden ausgeführt. Das bedeutet, dass es rein theoretisch sein könnte, dass folgender Ablauf zustande kommt:
Dienst: Checkt ob Prozess da ist >> ist nicht da >> wartet 30 sekunden
Zeitgleich mit dem Warten ist cceWork mal für 5 Sekunden da und das checkt dein Dienst natürlich nicht. Mit anderen Worten - wirklich sicher ist deine Überprüfung nicht.
Und was die anderen drei Zeilen machen sollen ist mir nur so mittelmäßig klar, was du jetzt da überhaupt splitten kannst.
Warum splittest du rechts 8 Zeichen vom ScriptDir weg? Ich kann nur vermuten - du meinst @ScriptDir enthält den Programmpfad und du willst den Dateinamen weg tun. Sollte das der Fall sein - nein, @ScriptDir ist der Ordner wo sich das Skript/die Exe befindet. Falls nein - dann erkläre doch bitte was du da treiben willst.
Ob die QueueWatch.exe den richtigen Pfad erhält ist schleierhaft. das @SW_SHOW kannst Du dir übrigens klemmen denke ich. Gezeigt wird wenn es eine GUI gibt im Normalfall imme soweit ich weiß. Und warum du in der ZEile 3 im If-Block mit @error ankommst und am Ende noch trotz FileWriteLine ein @CRLF anklemmst... erkläre doch bitte nochmal was genau da ablaufen soll. 