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

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

java -jar ... _osgi.jar -console 1234 & 

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

 telnet localhost 1234 stop 0 

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

我已经试过了

 echo stop 0 | telnet localhost 1234 

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

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

例如,以下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 { } } 

注意:如果你控制启动OSGi框架的启动器代码,你应该在那里安装关闭钩子而不是单独的捆绑。

更新

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

 # Launch app: java -jar ... & MY_PID=$! # Later when you want to stop your app: kill $MY_PID 

例如,如果除了telnet之外没有其他方法可以关闭应用程序,则可以使用expect。

http://www.tamas.io/automatic-scp-using-expect-and-bash/