请注意: Commons守护程序自 2013 以来尚未发布。所以,如果有一个更现代的替代方案(那与systemd
更加兼容),那么我会全神贯注并接受任何想法!
我正在尝试将我的Java 8应用程序部署并作为由systemd
管理的真正Linux服务运行。我已经阅读了Commons Daemon文档,我相信完成此任务的方法如下:
systemd
服务单位文件,比如一个/lib/systemd/system/myapp.service
文件;这将允许我通过systemctl start myapp
等手动控制我的应用程序,并且还允许我执行以下操作:配置我的应用程序以在Linux启动时启动,如果崩溃则始终尝试重新启动等等。Daemon
接口(来自Commons Daemon),这将允许我的应用程序“监听”从systemd
发送给它的事件,并在确定时调用正确的Java方法事情发生了(应用程序启动,停止,重启,Linux关闭等)。我最好尝试这样一个Daemon
impl:
public class MyApp implements Daemon {
private BillingService billingService;
private PizzaDeliveryService pizzaDeliveryService;
public MyApp() {
super();
// Do NOT initialize any services from inside here.
}
public static void main(String[] args) {
MyApp app = new MyApp();
}
@Override
public void init(DaemonContext context) throws DaemonInitException, Exception {
// 1. I assume this is where I do all my initializing,
// and that I don't init anything in my default ctor above?
billingService = new StripBillingService();
pizzaDeliveryService = new LittleCaesarsDeliveryService();
// etc.
}
@Override
public void start() throws Exception {
// 2. This is where my service starts actually doing things,
// firing up other threads, etc.
}
@Override
public void stop() throws Exception {
// 3. Will this respond to a Linux 'sudo shutdown -P now'
// command?
}
@Override
public void destroy() {
// 4. Where I'm supposed to actually release resources
// and terminate gracefully.
}
}
我对Daemon
界面的理解是否正确?简单地在MyApp
内实例化main
实例是否正确,然后Commons Daemon负责为我调用init(...)
和start(...)
?我是否正确不初始化任何MyApp
字段或从默认构造函数执行依赖注入,而而不是从init(...)
内部执行所有操作?< / p>
更重要的是(我的实际问题):哪些Linux命令会触发stop(...)
方法?
我问,因为我打算通过发出sudo shutdown -P now
或sudo halt -p
来关闭服务器,并且想知道哪个(如果有的话)命令会提示systemd
调用{{1} }} 方法。 有什么想法吗?