사용자로 특정 스크립트/명령을 실행하면 중단되지만 루트로 실행하면 정상적으로 작동합니다.

사용자로 특정 스크립트/명령을 실행하면 중단되지만 루트로 실행하면 정상적으로 작동합니다.

특정 스크립트나 명령을 실행할 때 중단되는 사용자가 있습니다 jenkins(안드로이드 빌드 서버입니다). 와 동일한 스크립트/명령을 실행하면 root정상적으로 실행됩니다.

예:

사용자로 jenkins:
> java
--hang--

사용자로서 root:
> java
-- 도움말 출력을 사용하십시오 --

jenkins이는 ( 예: and ) 로 실행되는 많은 명령에서 android발생 하지만 java및 같은 명령은 잘 작동합니다.pscat

이는 최근 개발된 것이므로 일종의 권한 문제일 수 있지만 확신할 수는 없습니다.

업데이트: 호출 시 중단됨 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

관련 정보