如何从命令行停止 OSGI 应用程序
How to stop an OSGI Application from command line
我有一个 运行 osgi(equinox 容器)应用程序。它将通过 bash 脚本启动。 See felix gogo shell
java -jar ... _osgi.jar -console 1234 &
这一切都很好,我也可以通过
停止它
telnet localhost 1234
<osgi>stop 0
但我正在寻找的是如何将其嵌入到 bash 脚本中以停止 osgi 应用程序。
我已经试过了
echo stop 0 | telnet localhost 1234
但这不起作用。因此,如果有人知道如何将其放入 bash 脚本中,请告诉我。
例如,如果除了 telnet 之外没有其他方法关闭应用程序,您可以使用 expect。
远程登录到 Gogo shell 似乎是一个非常脆弱的解决方案。为什么不编写支持标准 POSIX 信号处理的应用程序?然后你可以用 kill -s TERM <pid>
.
简单地杀死它
例如,下面的包激活器安装了一个关闭钩子,可以干净地关闭框架,等同于 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
我有一个 运行 osgi(equinox 容器)应用程序。它将通过 bash 脚本启动。 See felix gogo shell
java -jar ... _osgi.jar -console 1234 &
这一切都很好,我也可以通过
停止它telnet localhost 1234
<osgi>stop 0
但我正在寻找的是如何将其嵌入到 bash 脚本中以停止 osgi 应用程序。
我已经试过了
echo stop 0 | telnet localhost 1234
但这不起作用。因此,如果有人知道如何将其放入 bash 脚本中,请告诉我。
例如,如果除了 telnet 之外没有其他方法关闭应用程序,您可以使用 expect。
远程登录到 Gogo shell 似乎是一个非常脆弱的解决方案。为什么不编写支持标准 POSIX 信号处理的应用程序?然后你可以用 kill -s TERM <pid>
.
例如,下面的包激活器安装了一个关闭钩子,可以干净地关闭框架,等同于 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