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

How to run .jar continually and automatically on Debian server?

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

目前我已经弄清楚如何在 Cygwin 上通过 ssh 访问服务器并启动 .jar。但是当我在我的开发机器上关闭 Cygwin window 时,它会终止服务器上的进程(我认为,因为它不再响应)。

目前我是这样启动的:

java -jar myjar.jar packageName.fileNameOfFileWithMainMethod

我需要使这个文件运行在服务器上自动且持续地(它是我正在开发的系统的一个组成部分)。

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

我已阅读(并进行了编辑,因为文本一团糟)this 问题,但尽管我觉得它可能暗示了正确的方向,但我并没有从中得到太多帮助。我也尽了最大的努力 googlefu,但它给了我很多只切线相关的结果。

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

有人能解释一下这是怎么做到的吗?

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

This article from unix stack exchange 应该会让您朝着正确的方向前进,以便 运行 使用 cron 生成 jar 文件。

或者,this article from mkyong.com 也清晰简洁。

例如:

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

最简单的解决方案是使用 nohup&:

分离进程
nohup java -jar myjar.jar packageName.fileNameOfFileWithMainMethod &

可以使用 kill <process-id> 命令停止进程

进程 ID 可以通过 ps -ef | grep packageName.fileNameOfFileWithMainMethod

找到

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

Shell hooks 对配置用户环境变量很有用。

Cron 用于计划作业,主要是相关维护,例如创建备份、管理日志文件等...

按照 Николай Митропольский 的建议使用 nohup 进行后台处理,或者使用“screen”应用程序(让您 detach/reattach 到 "session"),在开发时会有用。
但无法处理服务器关闭清理,或响应重新启动。

Init scripts 上面提到的是 start/stop 服务的标准方式。

有一个名为init的应用程序,它是类Unix系统启动时启动的第一个应用程序。
Init,根据运行级别,启动一些脚本,这些脚本管理daemons(Windows中的服务)。
所以对于服务,你写 "hooks" for runlevels,

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

这些脚本是用参数调用的
(标准关键字,如"start"、"stop"等。)。

/etc/rc?.d/(其中 ? 是 运行 级别之一),其中 init 找到 运行 的脚本.
但是这些脚本只是 "automatically created" 符号 link 到 /etc/init.d/.
中的脚本 您不需要触摸 /etc/rc?.d/ 文件夹中的任何内容。
*将脚本放入 /etc/init.d/,
后 你只需要调用创建符号 links *:

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

如您所见,脚本名称附有一些前缀; 例如 /etc/rc1.d/K10apache2 这是一个符号 link 到 /etc/init.d/apache2 .
所以一个简单的 "ordered by name execution" 在这里是可能的。

自动创建那些前缀(因此执行顺序), 需要依赖信息。
所以 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 世界发生了巨大的转变 debates/fragmentations。
Init 和 init 脚本,传统上用于 Unix/Unix-like 系统,如今在许多系统上已过时。
https://en.wikipedia.org/wiki/Init#Replacements_for_init
Debian 目前使用 systemd,但是 init scripts 仍然可以使用 systemd(systemd 提供兼容性)。