我有一个用户jenkins
在运行某些脚本或命令时挂起(这是一个 android 构建服务器)。当运行与 相同的脚本/命令时root
,它们执行正常。
例子:
作为用户jenkins
:
> java
--挂起--
作为用户root
:
> java
-- 使用帮助输出 --
对于许多作为 运行的命令(jenkins
例如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 和 root 用户上运行之间的差异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
TL;DR:某些用户将环境变量设置为 use 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
允许这些用户成功运行 java 命令。