如何在Debian服务器上连续自动运行.jar?

我有一个.jar文件,我想在Debian服务器上一直运行。

目前我已经想出了如何通过Cygwin上的ssh访问服务器并启动.jar 。 但是当我在我的开发机器上关闭Cygwin窗口时,它会杀死服务器上的进程(我认为,因为它不再响应)。

目前我这样开始:

 java -jar myjar.jar packageName.fileNameOfFileWithMainMethod 

我需要让这个文件在服务器上自动运行(它是我正在开发的系统中不可或缺的一部分)。

不幸的是,我对服务器管理或非Windows操作系统一无所知(不是我选择或制造服务器的人),所以我真的不知道该做什么,也不知道要搜索什么(显然,因为我的搜索没有给出有用的结果)。

我已经阅读(并且因为文字很乱而编辑) 这个问题,但是虽然我觉得它可能正在向正确的方向暗示,但我并没有得到很多帮助。 我也尝试了我最好的googlefu,但它让我得到了很多与切向相关的结果。

我想我将不得不制作某种脚本(可能包含上面的代码行),对它做一些事情并把它放在服务器上特定的地方以完成我想做的事情。

有人会如此善意地解释这是如何完成的吗?

一个简单的建议是使用Linux的CRON运行jar文件。

来自unix堆栈交换的这篇文章应该让你使用cron运行jar文件的正确方向。

或者, 来自mkyong.com的这篇文章也很简洁明了。

例如:

  1. 使用Cygwin连接
  2. 运行crontab -e
  3. 输入0 * * * * java -jar myjar.jar packageName.fileNameOfFileWithMainMethod以在小时的顶部每小时运行一次jar文件。 或者,要在服务器启动时启动它,请输入@reboot java -jar myjar.jar packageName.fileNameOfFileWithMainMethod

Shell挂钩适用于配置用户环境变量。

Cron用于预定作业,主要是相关维护,例如创建备份,管理日志文件等……

НиколайМитропольский建议使用nohup的后台进程,或带有“ screen ”应用程序的ssh(允许你分离/重新连接到“session”)的后台进程在开发时非常有用。
但无法处理服务器关闭清理或响应重启。

上面提到的Init脚本是启动/停止服务的标准方法。

有一个名为init的应用程序,它是在类Unix系统启动时启动的第一个应用程序。
根据运行级别 ,Init启动了一些脚本,这些脚本管理守护进程 (Windows中的服务)。
所以对于服务,你为运行级别编写“钩子”,

在Debian,/ etc / init.d /中放置init脚本,
你可以阅读这个文件夹里面的脚本来了解这个想法,
它们是文本文件(bash脚本)。

使用参数调用这些脚本
(标准关键字,如“开始”,“停止”等)。

/etc/rc?.d/ (其中?是运行级别之一),其中init找到要运行的脚本。
但这些脚本只是“自动创建”/etc/init.d/中脚本的符号链接。
您无需触摸/etc/rc?.d/文件夹中的任何内容。
*将您的脚本放入/etc/init.d/后,
你只需要打电话来创建符号链接*:

 sudo update-rc.d "your-scripts-name" defaults 

如您所见,脚本名称附加了一些前缀; 例如/etc/rc1.d/K10apache2 ,它是/etc/init.d/apache2的符号链接。
因此,这里可以实现简单的“按名称执行”。

自动创建这些前缀(所以执行顺序),需要依赖信息。
所以init脚本包含这些信息。 还应该调用(在哪个运行级别)这些脚本所需的信息(使用“start”或“stop”)。

此依赖关系信息作为注释放在这些脚本中。 例如apache服务器初始化脚本( /etc/init.d/apache2 )包括那些行;

 # Provides: apache2 # Required-Start: $local_fs $remote_fs $network $syslog $named # Required-Stop: $local_fs $remote_fs $network $syslog $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 

Debian政策中存在详细信息;
https://www.debian.org/doc/debian-policy/ch-opersys.html#s-sysvinit这也很有用; https://refspecs.linuxbase.org/LSB_2.1.0/LSB-generic/LSB-generic/iniscrptfunc.html

注意: Unix世界中存在巨大的转变和争论/碎片。
在Unix / Unix类系统中传统使用的Init和init脚本现在在许多系统上已经过时了。
https://en.wikipedia.org/wiki/Init#Replacements_for_init
Debian目前使用systemd ,但init脚本仍然可以与systemd一起使用(systemd提供了兼容性)。

最简单的解决方案是使用带有& nohup来分离进程:

 nohup java -jar myjar.jar packageName.fileNameOfFileWithMainMethod & 

使用kill 命令可以停止进程

ps -ef | grep packageName.fileNameOfFileWithMainMethod可以找到进程ID ps -ef | grep packageName.fileNameOfFileWithMainMethod

但是,如果您正在开发在服务器上长时间运行的严肃应用程序,则必须处理初始化系统,如systemdupstart或类似的东西。