java 脚本上的 Systemd 服务必须从工作文件夹运行

java 脚本上的 Systemd 服务必须从工作文件夹运行

我在 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

  1. 您可以使用WorkingDirectory=来模拟cd <path> && ./script.
  2. WorkingDirectory=通常,除非我们指定写入位置(不适用于),否则我们不需要bin。如果您可以更改脚本以使用绝对路径或相对于环境变量的路径,通常可以解决很多此类问题。
  3. 通常不需要设置$PATH。在 systemd 单元中使用绝对路径,如果您运行 shell 脚本,该脚本通常会PATH通过类似.bashrc.
  4. 你不需要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

相关内容