Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Service Wrapper for Linux cannot find environment variables

I'm using Java Service Wrapper (tanukisoftware) to run my java server on a centos linux machine. My java code accesses few environment variables using System.getenv

When I run the program without the wrapper (like ant run) i can access my environment variables but when I do it through the wrapper I cant (service XX console)

So I gave up and defined properties instead that i have defined in wrapper.conf. This solved my environment problem in the java code.

But then I realized that my log4j.xml also has some environment variable references. And since the environment variables are not available through the wrapper, my logging doesnt work.

So I've got to solve and make the environment variables available through the wrapper.

Interestingly my wrapper.conf works on a windows machine when running as a service and I can access the environment variables...Its just that its not working for a linux env.

My wrapper.conf below that I use for both environments.

        #encoding=UTF-8
        # Configuration files must begin with a line specifying the encoding
        #  of the file.

        #********************************************************************
        # Wrapper License Properties (Ignored by Community Edition)
        #********************************************************************
        # Professional and Standard Editions of the Wrapper require a valid
        #  License Key to start.  Licenses can be purchased or a trial license
        #  requested on the following pages:
        # http://wrapper.tanukisoftware.com/purchase
        # http://wrapper.tanukisoftware.com/trial

        # Include file problems can be debugged by removing the first '#'
        #  from the following line:
        ##include.debug

        # The Wrapper will look for either of the following optional files for a
        #  valid License Key.  License Key properties can optionally be included
        #  directly in this configuration file.
        #include ../conf/wrapper-license.conf
        #include ../conf/wrapper-license-%WRAPPER_HOST_NAME%.conf

        # The following property will output information about which License Key(s)
        #  are being found, and can aid in resolving any licensing problems.
        #wrapper.license.debug=TRUE

        #********************************************************************
        # Wrapper Localization
        #********************************************************************
        # Specify the locale which the Wrapper should use.  By default the system
        #  locale is used.
        #wrapper.lang=en_US # en_US or ja_JP

        # Specify the location of the Wrapper's language resources.  If these are
        #  missing, the Wrapper will default to the en_US locale.
        wrapper.lang.folder=../lang

        #********************************************************************
        # Wrapper Java Properties
        #********************************************************************
        # Java Application
        #  Locate the java binary on the system PATH:
        wrapper.java.command=java
        #  Specify a specific java binary:
        #set.JAVA_HOME=/java/path
        #wrapper.java.command=%JAVA_HOME%/bin/java

        # Tell the Wrapper to log the full generated Java command line.
        wrapper.java.command.loglevel=INFO

        # Java Main class.  This class must implement the WrapperListener interface
        #  or guarantee that the WrapperManager class is initialized.  Helper
        #  classes are provided to do this for you.  See the Integration section
        #  of the documentation for details.
        wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

        # Java Classpath (include wrapper.jar)  Add class path elements as
        #  needed starting from 1
        wrapper.java.classpath.1=../lib/wrapper.jar
        wrapper.java.classpath.2=../bin/ventsimulator.jar
        wrapper.java.classpath.3=../lib/netty-3.2.4.Final-sources.jar
        wrapper.java.classpath.4=../lib/netty-3.2.4.Final.jar
        wrapper.java.classpath.5=../lib/theronyxutils.jar


        # Java Library Path (location of Wrapper.DLL or libwrapper.so)
        wrapper.java.library.path.1=../lib

        # Java Bits.  On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
        wrapper.java.additional.auto_bits=TRUE

        # Java Additional Parameters
        # Wait 4 secs till application initializes.
        # Make environment variables available as properties as an option, because on linux somehow the ENV variables are not available, through wrapper
        set.default.MDASJ_HOME_WIN=C:/Projects/MDASJ/code/mdasj-core/MDASJ
        set.default.MDASJ_PROJECTS_WIN=C:/Projects/MDASJ/code
        set.default.MDASJ_HOME_LINUX=/opt/mdasjroot/MDASJ
        set.default.MDASJ_PROJECTS_LINUX=/opt/mdasjroot


        wrapper.java.additional.1=-Dorg.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait=4
        wrapper.java.additional.2=-DMDASJ_HOME_WIN=%MDASJ_HOME_WIN%
        wrapper.java.additional.3=-DMDASJ_PROJECTS_WIN=%MDASJ_PROJECTS_WIN%
        wrapper.java.additional.4=-DMDASJ_HOME_LINUX=%MDASJ_HOME_LINUX%
        wrapper.java.additional.5=-DMDASJ_PROJECTS_LINUX=%MDASJ_PROJECTS_LINUX%


        # Initial Java Heap Size (in MB)
        #wrapper.java.initmemory=3

        # Maximum Java Heap Size (in MB)
        #wrapper.java.maxmemory=64

        # Application parameters.  Add parameters as needed starting from 1
        wrapper.app.parameter.1=com.theronyx.simulator.SimulatorManager

        #********************************************************************
        # Wrapper Logging Properties
        #********************************************************************
        # Enables Debug output from the Wrapper.
        # wrapper.debug=TRUE

        # Format of output for the console.  (See docs for formats)
        wrapper.console.format=PM

        # Log Level for console output.  (See docs for log levels)
        wrapper.console.loglevel=INFO

        # Log file to use for wrapper output logging.
        wrapper.logfile=%MDASJ_PROJECTS%/log/ventsimulator-wrapper.log

        # Format of output for the log file.  (See docs for formats)
        wrapper.logfile.format=LPTM

        # Log Level for log file output.  (See docs for log levels)
        wrapper.logfile.loglevel=INFO

        # Maximum size that the log file will be allowed to grow to before
        #  the log is rolled. Size is specified in bytes.  The default value
        #  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
        #  'm' (mb) suffix.  For example: 10m = 10 megabytes.
        wrapper.logfile.maxsize=0

        # Maximum number of rolled log files which will be allowed before old
        #  files are deleted.  The default value of 0 implies no limit.
        wrapper.logfile.maxfiles=0

        # Log Level for sys/event log output.  (See docs for log levels)
        wrapper.syslog.loglevel=NONE

        #********************************************************************
        # Wrapper General Properties
        #********************************************************************
        # Allow for the use of non-contiguous numbered properties
        wrapper.ignore_sequence_gaps=TRUE

        # Title to use when running as a console
        wrapper.console.title=OPUS Ventilator Simulator

        #********************************************************************
        # Wrapper JVM Checks
        #********************************************************************
        # Detect DeadLocked Threads in the JVM. (Requires Standard Edition)
        wrapper.check.deadlock=TRUE
        wrapper.check.deadlock.interval=60
        wrapper.check.deadlock.action=RESTART
        wrapper.check.deadlock.output=FULL

        # Out Of Memory detection.
        # (Simple match)
        wrapper.filter.trigger.1000=java.lang.OutOfMemoryError
        # (Only match text in stack traces if -XX:+PrintClassHistogram is being used.)
        #wrapper.filter.trigger.1000=Exception in thread "*" java.lang.OutOfMemoryError
        #wrapper.filter.allow_wildcards.1000=TRUE
        wrapper.filter.action.1000=RESTART
        wrapper.filter.message.1000=WRAPPER detected java.lang.OutOfMemoryError.....The JVM has run out of memory... RESTARTING

        #********************************************************************
        # Wrapper Email Notifications. (Requires Professional Edition)
        #********************************************************************
        # Common Event Email settings.
        #wrapper.event.default.email.debug=TRUE
        #wrapper.event.default.email.smtp.host=<SMTP_Host>
        #wrapper.event.default.email.smtp.port=25
        #wrapper.event.default.email.subject=[%WRAPPER_HOSTNAME%:%WRAPPER_NAME%:%WRAPPER_EVENT_NAME%] Event Notification
        #wrapper.event.default.email.sender=<Sender email>
        #wrapper.event.default.email.recipient=<Recipient email>

        # Configure the log attached to event emails.
        #wrapper.event.default.email.attach_log=TRUE
        #wrapper.event.default.email.maillog.lines=50
        #wrapper.event.default.email.maillog.format=LPTM
        #wrapper.event.default.email.maillog.loglevel=INFO

        # Enable specific event emails.
        #wrapper.event.wrapper_start.email=TRUE
        #wrapper.event.jvm_prelaunch.email=TRUE
        #wrapper.event.jvm_start.email=TRUE
        #wrapper.event.jvm_started.email=TRUE
        #wrapper.event.jvm_deadlock.email=TRUE
        #wrapper.event.jvm_stop.email=TRUE
        #wrapper.event.jvm_stopped.email=TRUE
        #wrapper.event.jvm_restart.email=TRUE
        #wrapper.event.jvm_failed_invocation.email=TRUE
        #wrapper.event.jvm_max_failed_invocations.email=TRUE
        #wrapper.event.jvm_kill.email=TRUE
        #wrapper.event.jvm_killed.email=TRUE
        #wrapper.event.jvm_unexpected_exit.email=TRUE
        #wrapper.event.wrapper_stop.email=TRUE

        # Specify custom mail content
        wrapper.event.jvm_restart.email.body=The JVM was restarted.\n\nPlease check on its status.\n

        #********************************************************************
        # Wrapper Windows NT/2000/XP Service Properties
        #********************************************************************
        # WARNING - Do not modify any of these properties when an application
        #  using this configuration file has been installed as a service.
        #  Please uninstall the service before modifying this section.  The
        #  service can then be reinstalled.

        # Name of the service
        wrapper.name=VentSimulator

        # Display name of the service
        wrapper.displayname=OPUS Vent Simulator

        # Description of the service
        wrapper.description=Runs a  Vent Simulation program to use with OPUS MDASJ, just for testing purposes

        # Service dependencies.  Add dependencies as needed starting from 1
        wrapper.ntservice.dependency.1=

        # Mode in which the service is installed.  AUTO_START, DELAY_START or DEMAND_START
        wrapper.ntservice.starttype=AUTO_START

        # Allow the service to interact with the desktop.
        wrapper.ntservice.interactive=false
like image 561
FatherFigure Avatar asked Oct 09 '22 23:10

FatherFigure


2 Answers

It makes sense that you do not see the environment variables on Linux. Try running your application by calling the /etc/init.d script directly. It should work. What happens is that the service command resets the environment variables (so that a service is always run in a consistent environment).

like image 146
Konstantin Tarashchanskiy Avatar answered Oct 20 '22 04:10

Konstantin Tarashchanskiy


Use the parameter wrapper.java.additional and -D graciously ;-)

As you already might know environmental parameters may not be available for every user/process, so you should help the application by adding additional parameters on the command line.

like image 26
lauwie Avatar answered Oct 20 '22 04:10

lauwie