![在 Jenkins 管道中执行 shell 脚本期间未找到 lsof 命令](https://linux22.com/image/192994/%E5%9C%A8%20Jenkins%20%E7%AE%A1%E9%81%93%E4%B8%AD%E6%89%A7%E8%A1%8C%20shell%20%E8%84%9A%E6%9C%AC%E6%9C%9F%E9%97%B4%E6%9C%AA%E6%89%BE%E5%88%B0%20lsof%20%E5%91%BD%E4%BB%A4.png)
我正在尝试获取针对特定端口运行的进程 ID,因此手动执行成功执行的命令 -
lsof -i :9090 -t
但是如果我通过 Jenkins 管道的 shell 脚本在同一台机器上运行相同的代码,则会导致错误 -lsof: command not found
以下是 Jenkins 管道中的代码 -
def stopServer() {
script {
echo "Stopping server"
sh '''var=\$(lsof -i :9090 -t)
kill -TERM \$var
'''
}
}
请帮助理解为什么相同的命令可以从同一台机器的终端运行,但不能从 Jenkins 管道的 shell 脚本运行。
答案1
这是因为不在' PATH 环境变量lsof
中列出的目录中。jenkins
解决方案是:
- 确保 jenkins 内的 PATH 设置正确或者
lsof
在 def 中指定完整路径名stopServer
。
顺便说一句,lsof -i :9090 -t
不只是列出本地服务器进程的 PID聆听在端口 9090 上,它还列出了连接到网络上任何计算机的端口 9090 的任何客户端进程的 PID。
您可能想改用netstat -tpln
。例如
netstat -tpln | awk -F'[[:space:]/:]+' '$5 == 9090 {print $(NF-2)}'