Leider bittet Microsoft keinen einfaches Tool an, ein beliebiges Programm als Service zu starten.
In den Tests hat sich zum Schluss das Tool NSSM - the Non-Sucking Service Manager am besten und einfachsten herausgestellt.
Ziel ist es, ein PowerShell Script beim Start des Servers auszuführen.
Dies ließe sich eigentliche besser über den Windows Scheduler durchführen, allerdings muss VOR diesem Script der Oracle Service gestartet werden und der läuft als Dienst.
Um daher die Abhängigkeit darstellen zu können, das ganze als Service angelegt.
Hintergrund Oracle Instance für Standby im Mount Modus öffnen
Download über:
Installation:
Starten einer administrativen Powerschell Session und Aufruf der Software:
cd D:\tools\nssm-2.24\win64 .\nssm.exe install
Über diese Oberfläche die Parameter des Service angeben:
Parameter:
Das Powershell Script für den Start der DB im Mount Modus siehe auch hier ⇒ https://orapowershell.codeplex.com/SourceControl/latest#ps/autoStart/mount_database.ps1
Unter dem Reiter Log On den DB User eintragen:
Das das Script ja nach Start der DB fertig ist und der Service sich nicht ständig neu starten soll: Unter dem Reiter Exit Actions:
Test ob der Service eingerichtet ist:
C:\Windows\System32\sc.exe query "ORACLE_MOUNT"
Den Oracle Service auf „Manuel“ setzen, der Oracle Service wird auch von dem Script mit gestartet.
siehe auch ⇒ http://www.reddit.com/r/PowerShell/comments/2bgtdh/best_practices_to_run_script_continuously_as_a/
Download über http://www.pirmasoft.de/cms/freeware/runassvc
Ein erster test war für meine Problemstellung allerdings nicht erfolgreich.
Aus einem Microsoft Forum:
Über das freie Werkzeug „SRVSTART.EXE - Windows NT Service Execution“ von http://www.rozanski.org.uk/services lässt sich sehr gut ein Programm als Service einrichten.
Download der Software von hier: http://rozanski.org.uk/software
Einrichten am Beispiel eines speziellen Start Scripts für eine Oracle Data Guard Umgebung:
[ORACLE_MOUNT] startup="%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File D:\oracle\autostart\mount_database.ps1" startup_dir="D:\oracle\autostart\" debug_out=D:\oracle\autostart\oracle_mount_srv.log shutdown_method=kill auto_restart=n
$stream = [System.IO.StreamWriter] "d:\debug.out" $log="LOG -- Start the the database" $stream.WriteLine($log) # do some work $stream.close()
cd D:\oracle\autostart .\srvstart install ORACLE_MOUNT -c D:\oracle\autostart\mount_database.ini #alternativ: C:\Windows\System32\sc.exe CREATE ORACLE_MOUNT DisplayName= "ORACLE_MOUNT" binPath= "D:\oracle\autoStart\srvstart.exe ORACLE_MOUNT -c D:\oracle\autoStart\mount_database.ini" start= auto
Nun den Service starten über:
C:\Windows\System32\sc.exe start "ORACLE_MOUNT"
Service bei Bedarf wieder löschen
C:\Windows\System32\sc.exe delete ORACLE_MOUNT # bzw. ./srvstart remove ORACLE_MOUNT
Fehler:
SRVSTART: 2015/01/31 16:56:45 ERROR severity=0 thread=2636 source=D:\Home\Author\srvstart.v110\dll\CmdRunner.cpp line=1334 text=createProcess(): failed to start process '"C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File D:\oracle\autostart\mount_database.ps1"', error=267 SRVSTART: 2015/01/31 16:56:45 ERROR severity=0 thread=2636 source=D:\Home\Author\srvstart.v110\dll\CmdRunner.cpp line=1336 text=Exception 1 in Class '' method 'createProcess()'
Noch am Suchen, leider noch kein Erfolg, scheint doch nicht mehr zu funktionieren …. kann aber auch an Berechtigungen liegen? Dienst als User anmelden hilft evtl. weiter.
siehe auch:
Funktioniert aber nur mit Programmen die die Service Schnittstelle implementiert haben!
Mit dem Programm „sc“ kann unter Windows 2008 ein Programm als Service eingerichtet werden.
Ablauf:
Beispiel:
Anlegen
!Auf das Leerzeichen nach dem “=„ achten!
dir /x d:\programme (x86)\MY prog\listener.exe rem Pfad merken sc.exe create GPIListenerService binpath= "d:\PROGRAM~2\MYPOR~\listener.exe" displayName= "GPIListenerService " error= ignore start= auto type= own rem testen sc qc GPIListenerService
Ein möglicher Fehler ist der „error message 1053: The service did not respond to the start or control request in a timely fashion.“, oft liegt hier das Problem an Berechtigungen.
Ist das Programm aber nicht für einen Run as Service geeignet und antwortet nicht entsprechend schnell den aufrufenen Service wrapper von Windows, kann SC so einfach nicht verwendet werden.
Alternativ kann hier srvany.exe von Windows 2003 Resourcekit helfen, srvany dann wiederum mit sc einbinden.
siehe Anleitung hier: srvany.exe im MS Forum