【问题标题】:Daemonizing a java program using jsvc使用 jsvc 守护 Java 程序
【发布时间】:2012-12-31 11:40:41
【问题描述】:

我正在尝试使用 JSVC 将 java 程序作为守护程序运行。这是我使用的简单代码:

package daemonexample;
public class DaemonExample implements Daemon {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // TODO code application logic here
}

@Override
public void init(DaemonContext dc) throws DaemonInitException, Exception {
    System.out.println("initializing ...");
}

@Override
public void start() throws Exception {
    System.out.println("starting ...");
}

@Override
public void stop() throws Exception {
    System.out.println("stopping ...");
}

@Override
public void destroy() {
    System.out.println("done.");
}

}

还有命令:jsvc -debug -home $JAVA_HOME -cp /path/to/commons-daemon.jar:/path/to/DaemonExample.jar -user coder -outfile /tmp/example.out -errfile /tmp /example.err -pidfile /tmp/example.pid daemonexample.DaemonExample

当我运行它时,我得到:“将标准输出重定向到 /tmp/example.out 并将标准错误重定向到 /tmp/example.err”。但是目标文件是空的。我在这里错过了什么?

【问题讨论】:

  • 我知道 Jsvc 带来的唯一一个特性是 JVM 能够以 root 身份启动,绑定到特权端口,然后切换到非特权用户。其中没有任何东西真正使 Java 应用程序作为守护程序运行变得更容易。你可以很容易地nohup java -jar foo.jar & 或其他任何东西。您可能只是在为自己购买增加的复杂性而没有任何好处。

标签: java unix daemon jsvc


【解决方案1】:

检查您的 /tmp/example.err。它应该包含错误详细信息。

以下可能是问题:

1: you forgot import org.apache.commons.daemon.*; ?
2: if yes, then DaemonExample.class is not getting created.
3: make sure DaemonExample.class exists in DaemonExample.jar
4: jsvc, usually must be called using full path. i.e. /usr/bin/jsvc .... check your debug info

【讨论】:

  • 1:导入commons daemon完成。 2:类也在罐子里。如果我添加一个 main 函数并直接从 cmd 行运行 jar,它就可以正常工作。这表明该类存在于 jar 中。 4:我也是用完整路径调用jsvc 而且example.err也是空的
  • jsvc -debug 的输出是什么?可以发在这里吗?
  • @lcarus3 这是一个巨大的输出。所以不得不把它作为答案的一部分发布
【解决方案2】:

转储已解析的命令行参数 |分离:真 |显示版本:否 |显示帮助:否 |仅检查:已禁用 |停止:错误 |等待:0 |作为服务运行:否 |安装服务:否 |删除服务:否 | JVM 名称:“空” | Java 主页:“/库/Java/Home” | PID 文件:“/tmp/example.pid” |用户名:“根” |额外选项:1 | “-Djava.class.path=/Users/用户名/NetBeansProjects/DaemonExample/dist/DaemonExample.jar” |调用的类:“daemonexample.DaemonExample” |类参数:0

无需将用户更改为“root”! 用户“root”已验证 使用环境未在命令行上指定主页 主页不在命令行或环境中,正在搜索 试图在 /System/Library/Frameworks/JavaVM.framework/Home 中找到 Java Home 尝试定位 VM 配置文件 /System/Library/Frameworks/JavaVM.framework/Home/jre/lib/jvm.cfg 尝试定位 VM 配置文件 /System/Library/Frameworks/JavaVM.framework/Home/lib/jvm.cfg 在 /System/Library/Frameworks/JavaVM.framework/Home/lib/jvm.cfg 找到 VM 配置文件 在配置中找到 VM 客户端定义 检查库 /System/Library/Frameworks/JavaVM.framework/Home/../Libraries/libclient.dylib 在配置中找到 VM jvm 定义 检查库 /System/Library/Frameworks/JavaVM.framework/Home/../Libraries/libjvm.dylib 在配置中找到 VM 热点定义 检查库 /System/Library/Frameworks/JavaVM.framework/Home/../Libraries/libhotspot.dylib 在配置中找到 VM 服务器定义 检查库 /System/Library/Frameworks/JavaVM.framework/Home/../Libraries/libserver.dylib 在配置中找到 VM 经典定义 检查库 /System/Library/Frameworks/JavaVM.framework/Home/../Libraries/libclassic.dylib 找不到 VM 经典的库(跳过) Java Home 位于 /System/Library/Frameworks/JavaVM.framework/Home 转储 JAVA 家庭结构 | Java 主页:“/System/Library/Frameworks/JavaVM.framework/Home” | Java VM 配置:“/System/Library/Frameworks/JavaVM.framework/Home/lib/jvm.cfg” |找到的 JVM:4 | JVM 名称:“客户端” | “/System/Library/Frameworks/JavaVM.framework/Home/../Libraries/libclient.dylib” | JVM 名称:“jvm” | “/System/Library/Frameworks/JavaVM.framework/Home/../Libraries/libjvm.dylib” | JVM 名称:“热点” | “/System/Library/Frameworks/JavaVM.framework/Home/../Libraries/libhotspot.dylib” | JVM 名称:“服务器” | "/System/Library/Frameworks/JavaVM.framework/Home/../Libraries/libserver.dylib"

将 stdout 重定向到 /tmp/example.out 并将 stderr 重定向到 /tmp/example.err

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多