无聊细节警告:我有一个systemd
service
使用 bash 文件启动服务的文件。以下是相关服务文件:
[Unit]
Description=A program service
[Service]
User=root
#change this to your workspace
WorkingDirectory=/data/acloud/repository/lib
#path to executable.
#executable is a bash script file I created to run the application jar file
ExecStart=/data/acloud/repository/lib/program.sh
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
下面是program.sh
我在上面的服务文件中使用到的:
#!/bin/bash
sudo java -XX:+UseG1GC -Xmx1g -Xms512m -jar abc-program-0.0.1-SNAPSHOT.jar
如果你想知道为什么我创建了一个单行 bash 脚本,那是因为我不知道在哪里以及如何把-XX,-Xms-Xmx.service
文件中的参数。
即使服务处于非活动状态,主 PID 状态也会显示为,status=0/SUCCESS
并且在命令输出的末尾systemctl status
显示为Started a program service
?? 以下是其显示方式:
ubuntu@ip-172-**-**-***:/data/acloud/repository/lib$ sudo systemctl status program
program.service - A program service
Loaded: loaded (/etc/systemd/system/program.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Fri 2019-02-22 13:08:21 UTC; 45s ago
Process: 27711 ExecStart=/data/acloud/repository/lib/program.sh (code=exited, status=0/SUCCESS)
Main PID: 27711 (code=exited, status=0/SUCCESS)
Feb 22 13:08:21 ip-172-**-**-*** systemd[1]: Started A program service.
我认为使用 bash 会导致此问题,因为这里没有操纵退出代码。我该如何停止这种情况?
答案1
删除 sudo
sudo 在 systemd 脚本中几乎总是一个错误。
- 如果该单位是系统单位,它是多余的
- 如果不是 sudo 很可能会失败
- 如果它用于其他目的,例如
-H
-g
等,那么 systemd 具有所有这些功能
简而言之
$ sudo java -XX:+UseG1GC -Xmx1g -Xms512m -jar abc-program-0.0.1-SNAPSHOT.jar
可以替换为
$ java -XX:+UseG1GC -Xmx1g -Xms512m -jar abc-program-0.0.1-SNAPSHOT.jar
现在将其移入单位本身,即
删除 shell 脚本
什么阻碍了它发挥作用?
ExecStart=java -XX:+UseG1GC -Xmx1g -Xms512m -jar abc-program-0.0.1-SNAPSHOT.jar
可能没什么(它只是有效!)
但其可能的路径需要调整。你已经有了
WorkingDirectory=/data/acloud/repository/lib
我建议调查一下https://www.freedesktop.org/software/systemd/man/systemd.exec.html有User=
Group=
java 在路径上吗?你可以调整 PATH 环境变量,但最简单的方法是更改为
ExecStart=/fullpath/to/java -XX:+UseG1GC -Xmx1g…
(根据需要更改完整路径)
它还能用吗?我怀疑它不行……
正确的服务类型
那么如果你运行(在 shell 上)(注意&
末尾的 NO)会发生什么?
$ sudo java -XX:+UseG1GC -Xmx1g -Xms512m -jar abc-program-0.0.1-SNAPSHOT.jar
如果它完成了它的工作并且出来了你需要
type=oneshot
如果它继续在前台运行(即它“挂起”直到被杀死),你需要
type=simple
如果它立即返回并在后台运行守护进程,则需要
type=forking
如果是第三个你还需要提供
PIDFile=/path/to/service/pidfile
如果你首先需要
RemainAfterExit=yes