我在 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 系统,您需要其他解决方案。