删除 sudo

删除 sudo

无聊细节警告:我有一个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.htmlUser= 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
  1. 如果它完成了它的工作并且出来了你需要

    type=oneshot
    
  2. 如果它继续在前台运行(即它“挂起”直到被杀死),你需要

    type=simple
    
  3. 如果它立即返回并在后台运行守护进程,则需要

    type=forking
    

如果是第三个你还需要提供

PIDFile=/path/to/service/pidfile

如果你首先需要

RemainAfterExit=yes

相关内容