我在 ubuntu 20.04 服务器上安装了一个 java 应用程序,它是使用 JJS 命令行脚本文件启动的,如下所示:
#!../lib/bin/jre/bin/jjs -scripting function myJAVA(c){ bala bala bala ......}
通常要启动此应用程序,需要执行以下 2 个步骤:
# cd /my_app_path/MsgPro/bin
# ./myJAVA start
显然,我需要转到 bin 文件夹,然后从那里运行脚本,否则(如果从其他文件夹运行)会出现以下错误。
bash: ./bin/msgProcessor: ../lib/bin/jre/bin/jjs: bad interpreter: No such file or directory
我对java一无所知,但是后来被要求通过systemctl创建一个myJAVA.service,这将确保应用程序在服务器重新启动或意外退出时自动重新启动。
我知道 /etc/system/systemd/myJAVA.service 中的一个单元文件可以做到这一点,但不知道如何使其工作,下面是我的单元文件。
[Unit]
Description=myJAVA Daemon
After=network-online.target
[Service]
User=root
Environment=PATH=/bin:/sbin:/usr/bin:/usr/sbin
ExecStart=/my_app_path/MsgPro/bin/myJAVA start
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
我猜我的 ExecStart 或环境是错误的,但不知道正确的。
任何帮助都将受到高度赞赏。
答案1
在您的脚本中设置第一行:
#!../lib/bin/jre/bin/jjs
是绝对路径,而不是相对路径(如果这是解释器)
如果您只想运行程序,请使脚本如下所示:
....../lib/bin/jre/bin/jjs -scripting function myJAVA(c){ bala bala bala ......}
再次设置程序的绝对路径
答案2
- 您可以使用
WorkingDirectory=
来模拟cd <path> && ./script
. WorkingDirectory=
通常,除非我们指定写入位置(不适用于),否则我们不需要bin
。如果您可以更改脚本以使用绝对路径或相对于环境变量的路径,通常可以解决很多此类问题。- 通常不需要设置
$PATH
。在 systemd 单元中使用绝对路径,如果您运行 shell 脚本,该脚本通常会PATH
通过类似.bashrc
. - 你不需要
User=root
。这已经隐含在 systemd 服务总线上。
这项服务应该适合您:
[Unit]
Description=myJAVA Daemon
After=network-online.target
[Service]
WorkingDirectory=/my_app_path/MsgPro/bin
ExecStart=/my_app_path/MsgPro/bin/myJAVA start
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
- 你走在正确的轨道上
ExecStart=/absolute/path
。那肯定会运行你的脚本。 WorkingDirectory=
会让你的脚本找到那些与你的 bin ( ) 相关的东西../lib/bin/jre/bin/jjs
。