詹金斯无法终止进程:操作不允许

詹金斯无法终止进程:操作不允许

我在 centos 9 服务器中使用 Jenkins。我的目的是让 Jenkins 终止现有的 Java jar 进程并重新启动新构建的 Jar。以前,我曾对 centos 8 使用了相同的命令,但在安装 Centos 9 后,我遇到了这个问题。

process=`ps -ef | grep -v awk | awk -e '/java.*iqa/ { print $2 }'`
kill -9 ${process}

我收到以下错误消息。如何解决?

++ ps -ef
++ grep -v awk
++ awk -e '/java.*iqa./ { print $2 }'
+ process=57623
+ kill -9 57623
/tmp/jenkins15731163701833690666.sh: line 4: kill: (57623) - Operation not permitted
Build step 'Execute shell' marked build as failure

答案1

apropos kill errno并阅读有关 kill 系统调用和错误代码的手册。不允许的操作是EPERM。每man 2 kill

对于有权发送信号的进程来说,它必须具有特权(在 Linux 下:在目标进程的用户命名空间中具有 CAP_KILL 功能),或者发送进程的真实或有效用户 ID 必须等于目标进程的真实或保存的设置用户 ID。

检查 PID 与 jenkins shell,看看用户有何不同。还可以使用 查看 SELinux 上下文ps Z。不同的用户通常是一件好事,它提供了更好的隔离。在本例中,在部署工具和它安装的应用程序之间。

考虑在服务管理器中运行应用程序。在像这样的 systemd Linux 系统上,服务单元是一种选择。编写这样的单元后,您可以为 jenkins 用户提供通过 PolicyKit 规则管理单元的权限。当然,对 jenkins 脚本进行相应的更改以运行systemctl命令来管理服务。将使 ps 和 kill 命令过时,更好地处理单元进程。

将其移至服务管理器可让用户控制其以何种身份运行。您可以进一步强化并启用PrivateUsers=DynamicUser=在此单元上启用,从而完全断开 Java 应用程序用户与系统其余部分之间的连接。詹金斯仍然可以停止和启动该服务。

使用 systemd 的主要缺点是不可移植。对于非 Linux 系统,您需要其他解决方案。

相关内容