如何在Ubuntu上安装应用程序并使其作为守护进程运行?

我有一个Java应用程序 - 尽管不管是Java、Ruby、Python等,答案都应该是相同的 - 我想以这样的方式进行分发,当DevOps人员安装时,它会自动作为守护进程运行,在他们这一端不需要任何配置。我受到Docker守护进程的启发,它是用Go编写的,但在Ubuntu机器上可以自动配置自己为守护进程。我想做同样的事情,但我甚至不知道从哪里开始。

我会猜测要么:

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

有什么想法吗?

1个回答

在Ubuntu(和Debian)上,创建一个deb包将是最好的方法,因为可以自动化处理所有事情,这样就不需要任何最终用户干预。唯一不自动化安装或升级软件包的情况是如果软件包有一些需要用户输入的配置选项(主要仅在安装期间),或者如果用户修改了配置文件并且也被新版本的软件包修改(在升级期间)。此外,在安装/升级软件包之后,它安装的任何启动脚本都会自动启动。
您可以安装多个init脚本,并使一切正常。如果在用户的计算机上安装并使用了systemd,则如果同一服务既有init脚本又有systemd脚本,则忽略init脚本并使用systemd脚本。
关于软件包本身,Debian提供了辅助脚本,可以自动安装您提供的任何启动脚本(我认为它们的辅助脚本不支持upstart,因为这只在Ubuntu上使用),并启动服务。软件包示例,请参阅this中的debian文件夹,对应dump1090-mutability软件包。(免责声明:这是我的Github账户)请注意,dump1090-mutability.init文件包含init脚本,而dump1090-mutability.service文件包含systemd脚本。请注意,这些文件的名称应为package-name.initpackage-name.service,其中package-name是正在创建的二进制软件包的名称。(有关systemd的情况,请参阅man dh_systemd_enableman dh_systemd_start。)
在打包过程中,这两个文件都会被放置在用户系统的适当目录中,然后启动服务。对于rules文件,我建议您使用类似以下内容的配置,以便从自动化中受益(参见this关于--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

谢谢 @saiarcot895 (+1) - 理想情况下,我不希望分发源代码,而是希望deb安装程序可以直接安装打包好的JAR文件 - 这种可能吗?无论如何,请您更新您的答案,包括一个示例,展示最终分发的ZIP/TAR文件的目录结构会是什么样子?我想象中这个ZIP/TAR文件应该包含deb安装程序、安装脚本和JAR文件,但是对于整体的结构还不太清楚。再次感谢! - smeeb
1是的,你可以选择只发送JAR文件。请参考上面的最后一个要点。deb文件包含了所有内容;你不需要在deb文件之外再放其他文件,所以不需要将其放入zip/tar文件中。 - saiarcot895
再次感谢 @saiarcot895 (+1) - 最后一个追问,我保证!这个软件是完全兼容Ubuntu的吗,还是只能在Debian上运行?再次感谢! - smeeb
更好的是:它与Ubuntu和Debian兼容。 - saiarcot895
构建软件包本身必须在Ubuntu 15.04或Debian Jessie(或更新版本)上进行,因为涉及到--with systemd部分。但是,如果需要的话,通过添加一些代码,您可以选择在Ubuntu 14.04+或Debian Wheezy上进行编译,并使得生成的软件包能够在initsystemd系统上都能正常工作。 - saiarcot895