以用户身份运行某些脚本/命令会挂起,以 root 身份运行则可正常

以用户身份运行某些脚本/命令会挂起,以 root 身份运行则可正常

我有一个用户jenkins在运行某些脚本或命令时挂起(这是一个 android 构建服务器)。当运行与 相同的脚本/命令时root,它们执行正常。

例子:

作为用户jenkins
> java
--挂起--

作为用户root
> java
-- 使用帮助输出 --

对于许多作为 运行的命令(jenkins例如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 和 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 命令。

相关内容