2016-08-16 4 views
2

HELP!init.d가있는 스프링 부트 실행 파일이 사용자 대신 루트로 실행

SpringBoot 1.3.6 및 Gradle과 함께 기본 제공 시작 스크립트를 사용하고 있습니다. 아, 그리고 distZip 작업은 물건을 압축합니다.

얼마 전에 한동안이 모든 것이 아주 잘 진행되었다. 그때 나는 그것을 망쳤다.

저는 나무 딸기 파이에 패키지 (기본적으로 Zip 압축이 풀림)를 설치하고 소유권과 사용 권한을 확인했습니다. 모든 것이 내가 (app "user"그룹 "pi"로) app을 실행하고자하는 사용자에 의해 소유되어 있으며 파일에 대한 권한이 있는지 확인합니다 (myapp/bin/myapp 스크립트의 경우 755, 거의 모든 것).

~ appservice/myapp/bin/myapp를 가리키는 /etc/init.d에 심볼릭 링크를 넣었고 시스템에 가져 오기 위해 update-rc.d myapp defaults를 실행했습니다. symlink 자체는 root/root가 소유하고 있습니다. 그러나 그것이 있어야한다고 생각합니다. 그렇지 않습니까?

두 가지 문제가 있습니다. 두 문제가 서로 연관되어 있다고 생각합니다.

우선, (init.d로 부팅하거나 "sudo service myapp start"로 수동으로) 스크립트를 시작한 경우에도 루트로 실행되는 것처럼 보입니다 (특히 앱이 액세스하는 데 사용하는 경로 파일은/home/appservice/myapp/files 대신/root/myapp/files로 나옵니다).

두 번째로 앱이 다운됩니다 ... 특히 syslog 메시지 "myapp.service start operation timed out. Terminating."이 표시됩니다. 앱을 정상적으로 종료 한 것처럼 보입니다. 아, 그리고 관련 ... 내가 "sudo service myapp start"로 시작하면 명령이 결코 반환되지 않습니다. 어떤 새로운 ...

셋째, 응용 프로그램 로그 출력은 /var/log/myapp.log가 아닌/var/log/syslog로 이동합니다. 이는 스프링 부트 설명서에서 말하는 것과 반대입니다.

나는 이것에 대한 배포판의 최종 회귀 테스트를하고 있으며 (최근의 유명한 단어들) 나는 최근에 아무 것도 변경하지 않았다 ... :) 아니, 실제로 배포와 관련된 가장 최근의 변경은 src/main/dist 디렉토리에 저장하고, 그 후 (올바른 사용자로 부팅 할 때) 실행 중이다.

실행 스크립트를 게시 하겠지만 springBoot {executable = true} 작업을 사용할 때 스프링 부트에서 제공하는 기본 스크립트입니다.

여기 내 전체 build.gradle 파일이 있습니다 ... 나는 어리 석음을 보지 못했지만 어쩌면 그렇게 할 것입니다.

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' 
} 
+0

... 내가 우편 번호를 통해 파일을 scp, 그것은 사용자/그룹 appservice/appservice에서 끝납니다. 내가 IP를 그룹화하기 위해 파일을 chgrp하려고 할 때 사용자 appservice가 그룹 pi 및 그룹 appservice의 구성원인데도 "조작이 허용되지 않음"을 얻습니다. "info appservice"로 확인한 경우 –

+0

당신이 기꺼이하고 유능한 경우 응용 프로그램을 관리하기 위해 systemd로 전환하려면이 대답을보십시오. http://stackoverflow.com/a/22121547/272180 – yglodt

+0

예! 저것은 잘 작동 한 것처럼 보입니다, yglodt. 고맙습니다. –

답변

1

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 start myapp 
systemctl stop myapp 
관련 될 수있다 불확실성의 또 다른 비트 사용자/그룹/권한 screwup의 어떤 종류를 가리 키도록 보인다
관련 문제