특정 스크립트나 명령을 실행할 때 중단되는 사용자가 있습니다 jenkins
(안드로이드 빌드 서버입니다). 와 동일한 스크립트/명령을 실행하면 root
정상적으로 실행됩니다.
예:
사용자로 jenkins
:
> java
--hang--
사용자로서 root
:
> java
-- 도움말 출력을 사용하십시오 --
jenkins
이는 ( 예: and ) 로 실행되는 많은 명령에서 android
발생 하지만 java
및 같은 명령은 잘 작동합니다.ps
cat
이는 최근 개발된 것이므로 일종의 권한 문제일 수 있지만 확신할 수는 없습니다.
업데이트: 호출 시 중단됨
set -x
을 보여주는 스크립트 시작 부분에 추가되었습니다.java
+ exec /etc/alternatives/java_sdk_1.8.0/bin/java -Dorg.gradle.appname=gradlew -classpath /var/lib/jenkins/workspace/android-project/gradle/wrapper/gradle-wrapper.jar org.gradle.wrapper.GradleWrapperMain assembleDebug
jenkins에서 실행하는 것과 루트 사용자로 실행하는 것의 차이점은 strace -fo java
다음 줄에서 차이를 보여줍니다.
5319 stat("/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-2.b16.e | 5302 stat("/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-2.b16.e
5319 open("/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-2.b16.e | 5302 open("/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-2.b16.e
5319 stat("/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-2.b16.e | 5302 stat("/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-2.b16.e
5319 open("/opt/glibc-2.14/lib/tls/x86_64/libpthread.so.0", | 5302 open("/etc/ld.so.cache", O_RDONLY) = 3
5319 stat("/opt/glibc-2.14/lib/tls/x86_64", 0x7ffe601248c0) | 5302 fstat(3, {st_mode=S_IFREG|0644, st_size=49448, ...}) =
5319 open("/opt/glibc-2.14/lib/tls/libpthread.so.0", O_RDONL | 5302 mmap(NULL, 49448, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa
5319 stat("/opt/glibc-2.14/lib/tls", 0x7ffe601248c0) = -1 EN | 5302 close(3) = 0
5319 open("/opt/glibc-2.14/lib/x86_64/libpthread.so.0", O_RD | 5302 open("/lib64/libpthread.so.0", O_RDONLY) = 3
5319 stat("/opt/glibc-2.14/lib/x86_64", 0x7ffe601248c0) = -1 | 5302 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0
5319 open("/opt/glibc-2.14/lib/libpthread.so.0", O_RDONLY) = | 5302 fstat(3, {st_mode=S_IFREG|0755, st_size=146592, ...}) =
왼쪽은 jenkins
사용자입니다. 환경 변수를 통해 가리키는 glibc-2.14 관련 영역에서는 실패한 것 같습니다 LD_LIBRARY_PATH
.
답변1
핵심요약: 일부 사용자는 환경 변수를 사용하도록 설정했는데 glibc-2.14
, 이로 인해 Java VM 실행이 실패했습니다.
strace diff를 살펴보세요. 특히 다음 줄을 살펴보세요.
5319 open("/opt/glibc-2.14/lib/libpthread.so.0", O_RDONLY)
이는 일부 사용자가 glibc-2.14
바이너리를 사용하고 다른 사용자가 시스템 glibc
라이브러리(버전 2.12)를 사용하고 있음을 나타냅니다.
차이점은 일부 사용자는 환경 LD_LIBRARY_PATH
변수를 이 glibc-2.14
디렉토리로 설정하고 다른 사용자는 그렇지 않기 때문에 시스템의 2.12
.LD_LIBRARY_PATH