我正在尝试获取针对特定端口运行的进程 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)}'