[daemon] after updating prunsrv to 1.2.0 on Windows - The Service doesn't start

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[daemon] after updating prunsrv to 1.2.0 on Windows - The Service doesn't start

David Gutknecht
Hello everybody,

I tried to update the prunsrv.exe (1.0.15) installed on my server
(Windows 2012) to the latest version (1.2.0)
I simply replaced the exe with the newest version.
After replacing it I was no more able to start the service.
Windows deliver the message "1067: the process has unexpectedly been
stopped"
The log-file contains only following messages:
[2019-08-30 14:43:49] [debug] ( prunsrv.c:1754) [20592] Apache Commons
Daemon procrun log initialized.
[2019-08-30 14:43:49] [info]  ( prunsrv.c:1758) [20592] Apache Commons
Daemon procrun (1.2.0.0 32-bit) started.
[2019-08-30 14:43:49] [info]  ( prunsrv.c:1668) [20592] Running Service
'Med2Unify_Swisscom'...
[2019-08-30 14:43:49] [debug] ( prunsrv.c:1441) [22040] Inside
ServiceMain...
[2019-08-30 14:43:49] [debug] ( prunsrv.c:904 ) [22040]
reportServiceStatusE: dwCurrentState = 2, dwWin32ExitCode = 0,
dwWaitHint = 3000, dwServiceSpecificExitCode = 0.
[2019-08-30 14:43:49] [info]  ( prunsrv.c:1196) [22040] Starting service...

If I replace back the prunsrv.exe with the oldest version (1.0.15). It
works fine.
I use AdoptOpenJDK (Hotspot) JRE 11

This is the command Line I used to install the service:
prunsrv.exe^
  //US//ServiceEngine^
  --Startup=manual^
  --DisplayName="ServiceEngine"^
  --Classpath=ServiceEngine.jar^
  --Jvm="C:\Program Files (x86)\jdk-11.0.4+11-jre\bin\client\jvm.dll"^
  --StartMode jvm^
  --StartClass ch.novcom.ServiceEngine^
  --StartMethod windowsService^
  --StartParams start^
  --StopMode jvm^
  --StopClass ch.novcom.ServiceEngine^
  --StopMethod windowsService^
  --StopParams stop^
  --LogPath "%CD%\log"^
  --LogPrefix ServiceEngine_
  --LogLevel Debug


And below the Java source code of the object that contains the Daemon part:
public class ServiceEngine implements Daemon {
     private final static Logger LOGGER =
Logger.getLogger(ServiceEngine.class.getName());

     private static TheEngine myEngine = null;
     private static ServiceEngine m2uInstance = new ServiceEngine();

     /**
      * The Java entry point.
      *
      * @param args
      *            Command line arguments, all ignored.
      */
     public static void main(String[] args) {
         LOGGER.entering("ServiceEngine", "main");
         // the main routine is only here so I can also run the app from the
         // command line

         m2uInstance.initialize();

         Scanner sc = new Scanner(System.in);
         //wait until receive stop command from keyboard
         System.out.printf("Enter 'stop' to halt: ");
         while(!sc.nextLine().toLowerCase().equals("stop") &&
myEngine!=null && myEngine.isAlive());

         if (myEngine!=null && myEngine.isAlive()) {
             m2uInstance.terminate();
         }
         sc.close();
         LOGGER.exiting("ServiceEngine", "main");
     }

     /**
      * Static methods called by prunsrv to start/stop the Windows
service. Pass
      * the argument "start" to start the service, and pass "stop" to
stop the
      * service.
      *
      * Taken lock, stock and barrel from Christopher Pierce's blog at
      * http://blog.platinumsolutions.com/node/234
      *
      * @param args
      *            Arguments from prunsrv command line
      **/
     public static void windowsService(String args[]) {
         String cmd = "start";
         if (args.length > 0) {
             cmd = args[0];
         }

         if ("start".equals(cmd)) {
             m2uInstance.windowsStart();
         } else {
             m2uInstance.windowsStop();
         }
     }

     public void windowsStart() {
         LOGGER.entering(getClass().getName(), "windowsStart");

         initialize();
         if (myEngine != null){
             while (myEngine.isAlive()) {
                 // don't return until stopped
                 synchronized (this) {
                     try {
                         this.wait(5000); // wait 5s and check if stopped
                     } catch (InterruptedException ie) {
                     }
                 }
             }
         }

         LOGGER.exiting(getClass().getName(), "windowsStart");
     }

     public void windowsStop() {
         LOGGER.entering(getClass().getName(), "windowsStop");
         terminate();
         synchronized (this) {
             // stop the start loop
             this.notify();
         }
         LOGGER.exiting(getClass().getName(), "windowsStop");
     }

     // Implementing the Daemon interface is not required for Windows
but is for
     // Linux
     @Override
     public void init(DaemonContext arg0) throws Exception {
         LOGGER.entering(getClass().getName(), "init");

         LOGGER.exiting(getClass().getName(), "init");
     }

     @Override
     public void start() {
         LOGGER.entering(getClass().getName(), "start");
         initialize();
         LOGGER.exiting(getClass().getName(), "start");
     }

     @Override
     public void stop() {
         LOGGER.entering(getClass().getName(), "stop");
         terminate();
         LOGGER.exiting(getClass().getName(), "stop");
     }

     @Override
     public void destroy() {
         LOGGER.entering(getClass().getName(), "destroy");
         LOGGER.exiting(getClass().getName(), "destroy");
     }

     /**
      * Do the work of starting the engine
      */
     private void initialize() {
         LOGGER.entering(getClass().getName(), "initialize");
         if (myEngine == null) {
LOGGER.logp(Level.INFO,getClass().getName(),"initialize","Starting the
Engine");
             myEngine = new TheEngine();
             if (myEngine.initialize()){
                 myEngine.start();
             }
             else {
LOGGER.logp(Level.SEVERE,getClass().getName(),"initialize","The Engine
has not been successfully initialized.");
                 myEngine = null;
             }
         }
         LOGGER.exiting(getClass().getName(), "initialize");
     }

     /**
      * Cleanly stop the engine.
      */
     public void terminate() {
         LOGGER.entering(getClass().getName(), "terminate");
         if (myEngine != null) {
LOGGER.logp(Level.INFO,getClass().getName(),"terminate","Stopping the
Engine");
             myEngine.terminate();
LOGGER.logp(Level.INFO,getClass().getName(),"terminate","Engine stopped");
         }
         LOGGER.exiting(getClass().getName(), "terminate");
     }

}



---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: [daemon] after updating prunsrv to 1.2.0 on Windows - The Service doesn't start

Mark Thomas
Known issue with 32-bit processes.

You can track progress here:
https://issues.apache.org/jira/browse/DAEMON-401

Mark


On 30/08/2019 15:57, David Gutknecht wrote:

> Hello everybody,
>
> I tried to update the prunsrv.exe (1.0.15) installed on my server
> (Windows 2012) to the latest version (1.2.0)
> I simply replaced the exe with the newest version.
> After replacing it I was no more able to start the service.
> Windows deliver the message "1067: the process has unexpectedly been
> stopped"
> The log-file contains only following messages:
> [2019-08-30 14:43:49] [debug] ( prunsrv.c:1754) [20592] Apache Commons
> Daemon procrun log initialized.
> [2019-08-30 14:43:49] [info]  ( prunsrv.c:1758) [20592] Apache Commons
> Daemon procrun (1.2.0.0 32-bit) started.
> [2019-08-30 14:43:49] [info]  ( prunsrv.c:1668) [20592] Running Service
> 'Med2Unify_Swisscom'...
> [2019-08-30 14:43:49] [debug] ( prunsrv.c:1441) [22040] Inside
> ServiceMain...
> [2019-08-30 14:43:49] [debug] ( prunsrv.c:904 ) [22040]
> reportServiceStatusE: dwCurrentState = 2, dwWin32ExitCode = 0,
> dwWaitHint = 3000, dwServiceSpecificExitCode = 0.
> [2019-08-30 14:43:49] [info]  ( prunsrv.c:1196) [22040] Starting service...
>
> If I replace back the prunsrv.exe with the oldest version (1.0.15). It
> works fine.
> I use AdoptOpenJDK (Hotspot) JRE 11
>
> This is the command Line I used to install the service:
> prunsrv.exe^
>  //US//ServiceEngine^
>  --Startup=manual^
>  --DisplayName="ServiceEngine"^
>  --Classpath=ServiceEngine.jar^
>  --Jvm="C:\Program Files (x86)\jdk-11.0.4+11-jre\bin\client\jvm.dll"^
>  --StartMode jvm^
>  --StartClass ch.novcom.ServiceEngine^
>  --StartMethod windowsService^
>  --StartParams start^
>  --StopMode jvm^
>  --StopClass ch.novcom.ServiceEngine^
>  --StopMethod windowsService^
>  --StopParams stop^
>  --LogPath "%CD%\log"^
>  --LogPrefix ServiceEngine_
>  --LogLevel Debug
>
>
> And below the Java source code of the object that contains the Daemon part:
> public class ServiceEngine implements Daemon {
>     private final static Logger LOGGER =
> Logger.getLogger(ServiceEngine.class.getName());
>
>     private static TheEngine myEngine = null;
>     private static ServiceEngine m2uInstance = new ServiceEngine();
>
>     /**
>      * The Java entry point.
>      *
>      * @param args
>      *            Command line arguments, all ignored.
>      */
>     public static void main(String[] args) {
>         LOGGER.entering("ServiceEngine", "main");
>         // the main routine is only here so I can also run the app from the
>         // command line
>
>         m2uInstance.initialize();
>
>         Scanner sc = new Scanner(System.in);
>         //wait until receive stop command from keyboard
>         System.out.printf("Enter 'stop' to halt: ");
>         while(!sc.nextLine().toLowerCase().equals("stop") &&
> myEngine!=null && myEngine.isAlive());
>
>         if (myEngine!=null && myEngine.isAlive()) {
>             m2uInstance.terminate();
>         }
>         sc.close();
>         LOGGER.exiting("ServiceEngine", "main");
>     }
>
>     /**
>      * Static methods called by prunsrv to start/stop the Windows
> service. Pass
>      * the argument "start" to start the service, and pass "stop" to
> stop the
>      * service.
>      *
>      * Taken lock, stock and barrel from Christopher Pierce's blog at
>      * http://blog.platinumsolutions.com/node/234
>      *
>      * @param args
>      *            Arguments from prunsrv command line
>      **/
>     public static void windowsService(String args[]) {
>         String cmd = "start";
>         if (args.length > 0) {
>             cmd = args[0];
>         }
>
>         if ("start".equals(cmd)) {
>             m2uInstance.windowsStart();
>         } else {
>             m2uInstance.windowsStop();
>         }
>     }
>
>     public void windowsStart() {
>         LOGGER.entering(getClass().getName(), "windowsStart");
>
>         initialize();
>         if (myEngine != null){
>             while (myEngine.isAlive()) {
>                 // don't return until stopped
>                 synchronized (this) {
>                     try {
>                         this.wait(5000); // wait 5s and check if stopped
>                     } catch (InterruptedException ie) {
>                     }
>                 }
>             }
>         }
>
>         LOGGER.exiting(getClass().getName(), "windowsStart");
>     }
>
>     public void windowsStop() {
>         LOGGER.entering(getClass().getName(), "windowsStop");
>         terminate();
>         synchronized (this) {
>             // stop the start loop
>             this.notify();
>         }
>         LOGGER.exiting(getClass().getName(), "windowsStop");
>     }
>
>     // Implementing the Daemon interface is not required for Windows but
> is for
>     // Linux
>     @Override
>     public void init(DaemonContext arg0) throws Exception {
>         LOGGER.entering(getClass().getName(), "init");
>
>         LOGGER.exiting(getClass().getName(), "init");
>     }
>
>     @Override
>     public void start() {
>         LOGGER.entering(getClass().getName(), "start");
>         initialize();
>         LOGGER.exiting(getClass().getName(), "start");
>     }
>
>     @Override
>     public void stop() {
>         LOGGER.entering(getClass().getName(), "stop");
>         terminate();
>         LOGGER.exiting(getClass().getName(), "stop");
>     }
>
>     @Override
>     public void destroy() {
>         LOGGER.entering(getClass().getName(), "destroy");
>         LOGGER.exiting(getClass().getName(), "destroy");
>     }
>
>     /**
>      * Do the work of starting the engine
>      */
>     private void initialize() {
>         LOGGER.entering(getClass().getName(), "initialize");
>         if (myEngine == null) {
> LOGGER.logp(Level.INFO,getClass().getName(),"initialize","Starting the
> Engine");
>             myEngine = new TheEngine();
>             if (myEngine.initialize()){
>                 myEngine.start();
>             }
>             else {
> LOGGER.logp(Level.SEVERE,getClass().getName(),"initialize","The Engine
> has not been successfully initialized.");
>                 myEngine = null;
>             }
>         }
>         LOGGER.exiting(getClass().getName(), "initialize");
>     }
>
>     /**
>      * Cleanly stop the engine.
>      */
>     public void terminate() {
>         LOGGER.entering(getClass().getName(), "terminate");
>         if (myEngine != null) {
> LOGGER.logp(Level.INFO,getClass().getName(),"terminate","Stopping the
> Engine");
>             myEngine.terminate();
> LOGGER.logp(Level.INFO,getClass().getName(),"terminate","Engine stopped");
>         }
>         LOGGER.exiting(getClass().getName(), "terminate");
>     }
>
> }
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>


---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]