当前位置: 首页 > 知识库问答 >
问题:

Spring boot可执行jar,init.d以root而不是用户身份启动

曾绯辞
2023-03-14

救命啊!

我正在使用SpringBoot1.3.6和Gradle的内置启动脚本。哦,还有distZip任务来拉链。

在不久之前,这一切都运作得很好...然后我--我不知道是什么--把事情搞砸了。

我已经在我的raspberry Pi上安装了这个包(基本上是解压缩的),并检查了所有权和权限。所有的东西都归我想要运行应用程序的用户所有(用户“AppService”组“Pi”),并确认文件的权限--如果有的话--太大了(对于myapp/bin/myapp脚本和其他几乎所有的东西,权限为755)。

我在/etc/init.d中放了一个符号链接,指向~appservice/myapp/bin/myapp,并运行update-rc.d myapp默认值将其放入系统。注意符号链接本身是root/root所有的,但我相信它应该是的,不是吗?

我看到了两个问题,我认为这两个问题是相互关联的。

首先,无论我如何启动脚本(在启动时使用init.d或手动使用“sudo service myapp start”),它似乎都是以root运行的(特别是,应用程序试图用来访问文件的路径显示为/root/myapp/files,而不是/home/appservice/myapp/files)。

二是app会崩溃……具体地说,我会得到syslog消息“myapp.service start operation timed out.terminating”。然后是程序的有序关闭。哦,还有相关的...如果使用“sudo service myapp start”启动,该命令将永远不会返回。这是新的...

第三,应用程序日志输出将转到/var/log/syslog,而不是转到/var/log/myapp.log,这似乎与Spring Boot文档中所说的相反。

我正在对此进行部署的最终回归测试,并且(著名的遗言)我最近没有改变任何东西...:)不,真的,最近与发行版相关的更改是添加了src/main/dist目录,并且在此之后就开始工作了(以正确的用户身份在引导时启动)。

我会发布启动脚本,但实际上,当您使用springBoot{executable=true}任务时,它是Spring Boot提供的默认脚本。

这是我的完整档案...我看不出有什么不对,但也许你会。

    buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.6.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'application'

apply from: 'gradle/gradle/helpers.gradle'

mainClassName = 'app.Application'

if (!hasProperty('mainClass')) {
    ext.mainClass = 'app.Application'
}

springBoot {
    executable = true
}

repositories {
    mavenCentral()
}

sourceSets {
  main {
    java      { srcDir 'src/main/java' }
    resources { srcDir '/src/main/resources' }
  }
  test {
    java      { srcDir 'src/test/java' }
    resources { srcDir 'src/test/resources' }
  }
}

project.ext {
  applicationVersion = "0.1.5-alpha"

  applicationRelease = isApplicationRelease()
  applicationDate = new Date()
  applicationRevision = getRevision()

  applicationVersionSnapshot = (!applicationRelease) ? "+SNAPSHOT.${asUTC(applicationDate, 'yyMMddHHmm')}.git${applicationRevision}" : ""
  applicationVersionFull = "${applicationVersion}${applicationVersionSnapshot}"
}

jar {
    baseName = 'myapp'
    version = '0.9.0'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {

    compile group: 'com.sun.mail', name: 'javax.mail', version: '1.5.2'
    compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.3.6'
    compile group: 'commons-cli', name:'commons-cli', version: '1.3.1'
    compile group: 'org.json', name:'json', version: '20140107'

    compile "commons-codec:commons-codec:1.10"

    compile("org.springframework.boot:spring-boot-starter-hateoas")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-mail")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.springframework:spring-web")
    compile("org.springframework:spring-messaging")
    compile("joda-time:joda-time:2.2")
    compile("com.fasterxml.jackson.core:jackson-databind")
    compile("com.googlecode.json-simple:json-simple")
    compile("org.jdom:jdom:2.0.0")
    compile("org.hibernate:hibernate-validator")
    compile("org.apache.tomcat.embed:tomcat-embed-el")
    compile("org.apache.commons:commons-io:1.3.2")
    compile("org.kamranzafar:jtar:2.3")
    compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity4")
    compile("com.jcraft:jsch:0.1.53")
    compile("javax.jmdns:jmdns:3.4.1")
    testCompile("org.springframework.boot:spring-boot-starter-test")


}

task wrapper(type: Wrapper) {
    gradleVersion = '2.14'
}

共有1个答案

公冶鸣
2023-03-14

我建议使用systemd运行和管理应用程序。

这使得在特定用户下运行应用程序变得非常容易。

为此,请按以下步骤进行:

首先,创建包含以下内容的服务定义文件/etc/systemd/system/myapp.service:

[Unit]
Description=My App

[Service]
User=nobody
# The configuration file application.properties should be here:
WorkingDirectory=/home/appservice/myapp/files 
ExecStart=/usr/bin/java -Xmx256m -jar myapp.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

然后,通知systemd新的服务文件:

systemctl daemon-reload
systemctl enable myapp.service

最后,您可以使用以下命令启动/停止新服务:

systemctl start myapp
systemctl stop myapp
 类似资料:
  • 问题内容: 我有一些bash脚本,它们会在指定的时间添加到cron作业中,但是需要以root用户身份执行。我正在尝试运行那些脚本,即crob作业,但是它需要root用户权限,因为我在受限root用户的ubuntuec2实例中运行此作业。以root用户身份运行那些脚本的解决方法是什么。 谢谢 问题答案: 有几种可能性: 1)将脚本添加到root的crontab中。为此,您必须要做或成为root用户,

  • 我使用Ansible安装了Nginx。要在Centos7上安装,我使用了yum软件包,因此默认情况下它是以root用户身份运行的。我希望它在Centos中以不同的用户(前nginx用户)身份启动和运行。当我尝试与其他用户一起运行时,会出现以下错误: nginx的工作。服务失败,因为控制进程已退出,错误代码为。有关详细信息,请参阅“systemctl status nginx.service”和“j

  • 问题内容: 我在Linux(Debian)上开发了C代码。有时,我需要通过执行一些命令 我想知道是否可以通过root用户执行命令。如果不是这种情况,是否有任何功能可以我在C代码上以root身份执行命令(或运行二进制文件)? 问题答案: 在遇到普通用户要执行root命令之前,我们遇到了这种情况,这是我们的解决方案(使用setuid / SUID): 假使,假设: 用户名 : 组别 : C程序文件 :

  • 我正在Docker中制作python Django应用程序的简单图像。但是在构建容器的末尾,它抛出了下一个警告(我正在Ubuntu 20.04上构建):

  • 本文向大家介绍以非root用户身份运行Docker容器,包括了以非root用户身份运行Docker容器的使用技巧和注意事项,需要的朋友参考一下 当您在Docker容器中运行应用程序时,默认情况下,它有权访问所有root特权。您可能已经注意到,当打开Ubuntu Docker Container Bash时,默认情况下您以root用户身份登录。在应用程序的安全性方面,这可能是一个主要问题。任何局外人

  • 我正在尝试以root用户身份运行脚本。这是我的密码 它在出错 我也遵循了这些方法,但最终出现了错误