===== Programme unter Windows 2008 / Windows 10 als Service starten ===== 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 [[dba:oracle_dataguard_standby_datenbank#auto_start_der_standby_db_pruefen_einstellen |Oracle Instance für Standby im Mount Modus öffnen]] ====NSSM - the Non-Sucking Service Manager==== Download über: * => http://nssm.cc/download Installation: * Auspacken nach D:\tools 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: {{ :windows:nssm_windows2008_autostart_v01.png?400 |NSSM - the Non-Sucking Service Manager }} Parameter: * Path => %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe * Startup Dir => D:\oracle\autostart * Paramter => -ExecutionPolicy Bypass -File D:\oracle\autostart\mount_database.ps1 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: * Log on as this account - Owner der DB 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: * Restart "No action (srvany compatible) * {{ :windows:windows_start_as_service_nssm_v02.png?300 | NSSM Restart option}} 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. Hat dann zum Schluss aber nur funktioniert wenn der DB Owner als Owner des Service eingetragen wurden! === Quellen === siehe auch => http://www.reddit.com/r/PowerShell/comments/2bgtdh/best_practices_to_run_script_continuously_as_a/ ---- ==== RunAsSVC ==== Download über http://www.pirmasoft.de/cms/freeware/runassvc Ein erster test war für meine Problemstellung allerdings nicht erfolgreich. ---- ==== "srvany.exe" aus dem Resource Kit ==== Aus einem Microsoft Forum: * At the time of this posting, there is no Windows Server 2008 Resource Kit Tools, so get the "srvany.exe " from the "Windows Server 2003 Resource Kit Tools " and copy it to a suitable location on your Win2008 server (e.g. C:\Windows\System32\ ). * Use "sc " to create a new service that launches "srvany " (e.g. sc create MyService binPath= C:\Windows\System32\srvany.exe DisplayName= "My Custom Service" ) * Using RegEdit : create a "Parameters " key for your service (e.g. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService\Paramaters\ ) * Using RegEdit : within the newly created "Parameters " key , create a string value called "Application " and unter the full path to the application you are wanting to run as a service. (No quotes required.) ---- ==== "SRVSTART.EXE - Windows NT Service Execution" ==== Ü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: * Datei srvstart_run.v110.zip auspacken nach d:\oracle\autostart * Init Datei mount_database.ini für den Start anlegen [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 * Eigentliche Powershell Datei mount_database.ps1 anlegen mit $stream = [System.IO.StreamWriter] "d:\debug.out" $log="LOG -- Start the the database" $stream.WriteLine($log) # do some work $stream.close() * Service anlegen mit (in einer administrativen Powershell Session!) 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: * http://www.howtogeek.com/50786/using-srvstart-to-run-any-application-as-a-windows-service/ ---- ==== MS Windows "sc" verwenden ===== 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: * Pfad zum Programm ermitteln (je nach dem wieviele Leer und Sonderzeichen enthalten sind, Kurzform verwenden (Anzeige mit Dir /x)) * Service anlegen * Service Eigenschaften anlegen 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 == Fehler == 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:[[ http://social.technet.microsoft.com/Forums/windowsserver/de-DE/98a97aee-c62b-4683-94ab-3777899cf7de/application-as-a-service-srvanyexe-in-windows-server-2008?forum=winserverMigration| srvany.exe im MS Forum ]] == Quellen == * sc.exe create: http://technet.microsoft.com/de-de/library/cc990289 * sc.exe config: http://technet.microsoft.com/de-de/library/cc990290 ---- ====Alternativen==== * http://runasservice.sourceforge.net/Manual.html * http://www.kwakkelflap.com/service.html