如何从命令行停止OSGI应用程序

Chr*_*utz 5 java bash osgi shutdown

我有一个运行的osgi(equinox容器)应用程序.它将通过bash脚本启动.见felix gogo shell

java -jar ... _osgi.jar -console 1234 &
Run Code Online (Sandbox Code Playgroud)

这一切都很好,我也可以阻止它

telnet localhost 1234
<osgi>stop 0
Run Code Online (Sandbox Code Playgroud)

但我正在寻找的是如何将其嵌入到bash脚本中以停止osgi应用程序.

我已经试过了

echo stop 0 | telnet localhost 1234
Run Code Online (Sandbox Code Playgroud)

但这不起作用.因此,如果有人知道如何将其放入bash脚本中,请告诉我.

Nei*_*ett 10

进入Gogo shell似乎是一个非常脆弱的解决方案.为什么不编写应用程序来支持标准POSIX信号处理?然后你可以简单地杀死它kill -s TERM <pid>.

例如,以下bundle激活器安装一个干净关闭框架的关闭钩子,等效于stop 0:

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.launch.Framework;

public class ShutdownHookActivator implements BundleActivator {

    @Override
    public void start(final BundleContext context) {
        Thread hook = new Thread() {
            @Override
            public void run() {
                System.out.println("Shutdown hook invoked, stopping OSGi Framework.");
                try {
                    Framework systemBundle = context.getBundle(0).adapt(Framework.class);
                    systemBundle.stop();
                    System.out.println("Waiting up to 2s for OSGi shutdown to complete...");
                    systemBundle.waitForStop(2000);
                } catch (Exception e) {
                    System.err.println("Failed to cleanly shutdown OSGi Framework: " + e.getMessage());
                    e.printStackTrace();
                }
            }
        };
        System.out.println("Installing shutdown hook.");
        Runtime.getRuntime().addShutdownHook(hook);
    }

    @Override
    public void stop(BundleContext context) throws Exception {
    }

}
Run Code Online (Sandbox Code Playgroud)

注意:如果你控制启动OSGi框架的启动程序代码,你应该在那里安装关闭钩子,而不是从一个单独的bundle.

更新

在bash中,$!变量求值为最后执行的后台命令的PID.您可以将其保存到您自己的变量中以供以后参考,例如:

# Launch app:
java -jar ... &
MY_PID=$!

# Later when you want to stop your app:
kill $MY_PID
Run Code Online (Sandbox Code Playgroud)