如何让应用程序在安装后在 Ubuntu 上作为守护进程运行?

如何让应用程序在安装后在 Ubuntu 上作为守护进程运行?

我有一个 Java 应用程序(尽管这里的答案应该是相同的,无论它是 Java、Ruby、Python 等)我希望以这样一种方式分发它,当 devops 人员去安装它时,它会自动作为守护进程运行,而无需他们进行任何配置。我的灵感来自于Docker 守护进程,它是用 Go 编写的,但它会自动将自己配置为 Ubuntu 机器上的守护进程。我想做同样的事情,但不知道从哪里开始。

我会想象或者:

  • 我需要以某种方式将我的应用程序打包在deb;或者
  • 将我的应用程序可执行文件与必要的init/ systemd/ upstart/等脚本一起发送,这些脚本以某种方式在本地安装,而无需最终用户运行它们。但是,在这种情况下,我不确定如何选择要安装哪些脚本,因为用户可能已init设置了多个类似工具中的任何一个。

有任何想法吗?

答案1

在 Ubuntu(和 Debian)上,创建deb软件包是最好的方法,因为一切都可以自动化,因此不需要最终用户的干预。软件包安装或升级不自动化的唯一情况是,如果软件包有一些配置选项需要用户输入(主要在安装期间),或者配置文件被用户修改,并且也被软件包的较新版本修改(在升级期间)。此外,在安装/升级软件包后,它安装的任何启动脚本都会自动启动。

您可以安装多个脚本,并且一切仍能正常工作。在用户计算机上安装和使用的init情况下,如果同时存在一个脚本和一个用于同一服务的脚本,则忽略该脚本并使用该脚本。systemdinitsystemdinitsystemd

就打包本身而言,Debian 提供了辅助脚本,这些脚本(除其他功能外)会自动安装您提供的任何启动脚本(我不认为upstart他们的辅助脚本支持此功能,因为这仅在 Ubuntu 上使用)并启动服务。有关打包的示例,请参阅 debian包的文件夹dump1090-mutability。(免责声明:这是我的 Github 帐户)请注意,文件dump1090-mutability.init包含init脚本,而dump1090-mutability.service文件包含脚本systemd。请注意,这些文件的名称应该是package-name.initpackage-name.service,其中package-name是正在创建的二进制包的名称。(有关 systemd 情况,请参阅man dh_systemd_enable和。)man dh_systemd_start

在打包时,这两个文件都放置在用户系统上的相应目录中,然后启动服务。对于文件rules,我建议您使用类似以下内容,以便您从自动化中受益(请参阅部分--with systemd):

#!/usr/bin/make -f
%:
        dh $@ --with systemd

override_dh_auto_build:
        # Specify how to build the Java files here, if there is no Makefile provided

override_dh_auto_install:
        # Specify how to install the Java files here, if there is no `install` target in the Makefile. Don't worry about anything in the `debian` directory unless you need to install some icons.
  • 如果您的应用没有 Makefile,而只是 Java 源文件的集合,请填写override_dh_auto_build(源文件编译并打包成 JAR 的位置)和override_dh_auto_install(JAR 的安装位置)。
  • 如果您的应用程序有 Makefile,但没有install目标,请删除override_dh_auto_build目标并填写override_dh_auto_install
  • 如果您的应用程序有一个 Makefile 并且有一个install目标(可以使用),请删除这两个目标。
  • 如果您的应用程序只是一个 JAR 文件,请删除override_dh_auto_build,并填写override_dh_auto_install

相关内容