我想在.jar
服务器上一直运行Debian
个文件。
目前,我已经找到了如何通过ssh
上的Cygwin
访问服务器并启动.jar
。但是当我关闭开发机器上的Cygwin窗口时,它会杀死服务器上的进程(我认为,因为它不再响应)。
目前我这样开始:
java -jar myjar.jar packageName.fileNameOfFileWithMainMethod
我需要让这个文件在服务器上自动运行(它是我正在开发的系统中不可或缺的一部分)。
不幸的是,我对服务器管理或非Windows操作系统一无所知(不是我选择或制造服务器的人),所以我真的不知道该做什么,也不知道要搜索什么(显然,因为我的搜索没有给出有用的结果)。
我已经阅读(并且因为文字很乱而被编辑)this问题,但是虽然我觉得它可能暗示正确的方向,但我没有得到很多帮助。我也尝试过最好的googlefu,但它让我得到了很多与切线相关的结果。
我想我必须制作某种脚本(可能包含上面的代码行),对它做一些事情并把它放在服务器上特定的地方以完成我想做的事情。
有人会如此善意地解释这是如何完成的吗?
答案 0 :(得分:2)
Shell挂钩适用于配置用户环境变量。
Cron 适用于预定作业,主要是相关维护,例如创建备份,管理日志文件等......
НиколайМитропольский建议使用 nohup 的后台流程,或带有“屏幕”应用程序的ssh(可让您分离/重新连接到“会话”)在开发时间有用。
但无法处理服务器关闭清理或响应重启。
初始化脚本是启动/停止服务的标准方法。
有一个名为 init 的应用程序,它是类Unix系统启动时启动的第一个应用程序。
根据运行级别,Init启动一些脚本,这些脚本管理守护程序(Windows中的服务)。
因此,对于服务,您可以为runlevels编写“挂钩”,
在Debian中, /etc/init.d / 放置初始化脚本,
你可以阅读这个文件夹里面的脚本来获得想法,
它们是文本文件(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 server init脚本( /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提供兼容性)。
答案 1 :(得分:1)
一个简单的建议是使用Linux CRON运行jar文件。
This article from unix stack exchange应该让你按照cron运行jar文件的正确方向。
或者,this article from mkyong.com也清晰简洁。
例如:
crontab -e
0 * * * * java -jar myjar.jar packageName.fileNameOfFileWithMainMethod
以在小时的顶部每小时运行一次jar文件。或者,要在服务器启动时启动一次,请输入@reboot java -jar myjar.jar packageName.fileNameOfFileWithMainMethod
答案 2 :(得分:1)
最简单的解决方案是使用nohup
与&
:
nohup java -jar myjar.jar packageName.fileNameOfFileWithMainMethod &
可以使用kill <process-id>
命令
可以在ps -ef | grep packageName.fileNameOfFileWithMainMethod
进程ID
但是,如果您正在开发在服务器上长时间运行的严肃应用程序,则必须处理初始化系统,如 systemd , upstart 或类似的东西。