适用于 Linux 的 Java Service Wrapper 找不到环境变量
我正在使用 Java Service Wrapper (tanukisoftware) 在 centos linux 机器上运行我的 java 服务器。我的java代码使用System.getenv访问一些环境变量
当我在没有包装器的情况下运行程序时(例如ant run),我可以访问我的环境变量,但是当我通过包装器执行它时,我不能(服务XX控制台)
所以我放弃了定义的属性而不是我在wrapper.conf中定义的属性。这解决了我的java代码中的环境问题。
但后来我意识到我的 log4j.xml 也有一些环境变量引用。由于环境变量无法通过包装器获得,因此我的日志记录不起作用。
所以我必须解决并通过包装器提供环境变量。
有趣的是,当我的wrapper.conf作为服务运行时,它可以在Windows机器上工作,并且我可以访问环境变量......只是它不适用于Linux环境。
我在这两种环境中都使用了下面的wrapper.conf。
#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
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您在 Linux 上看不到环境变量是有道理的。尝试通过直接调用 /etc/init.d 脚本来运行您的应用程序。它应该有效。所发生的情况是服务命令重置环境变量(以便服务始终在一致的环境中运行)。
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).
优雅地使用参数
wrapper.java.additional
和-D
;-)正如您可能已经知道的,环境参数可能不适用于每个
用户/进程,因此您应该通过在
命令行。
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.
你使用什么java版本?
getenv 在 1.3 中被弃用,但在 1.5 中恢复。
System.getenv("xxx") 返回什么?
是否只是找不到您定义的变量或常见的变量(例如 PATH 等)?
干杯
what java version are you using?
In 1.3 getenv got deprecated, but got reinstated in 1.5.
What is System.getenv("xxx") returning?
Is it only not finding the variables defined by you or also common ones (eg PATH etc)?
cheers
我在 yajsw-beta-12.05 版本中偶然发现了同样的问题。
那么我是如何偶然发现它的(这同样重要):我正在使用 .sh 文件来调用 java -jar 包装器和其他东西......并且正在导出一个环境变量。并且该环境变量在应用程序中不可见。这就是我的搜索开始的地方。
我没有使用像安装卸载之类的包装脚本。我宁愿直接使用wrapper.jar并使用经过非常精简的yajsw版本。所以我需要传递环境变量。我没有选择采用 {wrapper.java.additional} 方式,因为我的变量应该具有动态值。
我查看了 {wrapper.app.env.key1=value1} ,这确实为应用程序提供了环境变量。但后来我想要一个动态值。
但最终我发现,如果我的wrapper.conf 文件中有任何像
wrapper.app.env.DUMMY=value
这样的虚拟条目,那么所有从 linux shell 脚本导出的变量都将在该应用程序。希望这对某人有帮助。
I stumbled upon the same problem with yajsw-beta-12.05 version.
So HOW I Stumbled upon it ( this is equally important) : I was using a .sh file to invoke
java -jar wrapper
and stuff...and was exporting an environment variable. And that env variable was not visible in the app. That's where my search began.I am not using the wrapper scripts like install uninstall and all. I am rather using the wrapper.jar directly and using a very trimmed version of yajsw. So there I needed to pass the environment variable. I did not choose to go {wrapper.java.additional} way, as my variable was supposed to have dynamic value.
I looked into {wrapper.app.env.key1=value1} , this does indeed provides the environment variable into the app.But then I wanted to have a dynamic value.
But ultimately what I found out was, If I had any dummy entry like
wrapper.app.env.DUMMY=value
in my wrapper.conf file, then all the exported variables from linux shell script becomes visible in the app.Hope this helps someone.
在
opt/apacheds-2.0.0.AM26/conf/wrapper.conf
中设置以下内容($JAVA_HOME/bin/java)对我有用。Setting the below($JAVA_HOME/bin/java) in the
opt/apacheds-2.0.0.AM26/conf/wrapper.conf
worked for me.