Jenkins执行JMeter脚本遇jmeter.log权限拒绝错误求助
问题分析
你在Linux命令行下能正常执行JMeter脚本生成testres.jtl,命令如下:
./jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t /etc/tomcat/Catalina/parser/test.jmx -l /etc/tomcat/Catalina/parser/testres.jtl
但通过Jenkins的Execute Shell步骤运行相同命令时,出现FileNotFoundException: jmeter.log (Permission denied)错误。这是因为Jenkins默认以jenkins系统用户运行,而该用户没有命令执行时当前工作目录的写入权限——JMeter默认会在当前目录创建并写入jmeter.log,权限不足就会触发这个错误。
可行解决方案
以下是按推荐优先级排序的解决办法:
1. 直接指定JMeter日志文件路径(最推荐)
在JMeter命令中通过-j参数指定jmeter.log的存储位置,选一个jenkins用户有写入权限的目录,比如Jenkins项目的工作空间,或者临时目录:
# 指定到Jenkins项目工作空间 ./jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t /etc/tomcat/Catalina/parser/test.jmx -l /etc/tomcat/Catalina/parser/testres.jtl -j /var/lib/jenkins/workspaces/your-project-name/jmeter.log # 或者用临时目录(权限开放,适合快速测试) ./jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t /etc/tomcat/Catalina/parser/test.jmx -l /etc/tomcat/Catalina/parser/testres.jtl -j /tmp/jmeter.log
替换your-project-name为你实际的Jenkins项目名称,确保路径存在且jenkins用户有权限写入。
2. 切换到有写入权限的目录再执行命令
在Jenkins的Execute Shell步骤中,先切换到jenkins用户有权限的目录(比如JMeter的bin目录),再执行JMeter命令:
cd /path/to/your/jmeter/bin ./jmeter.sh -Jjmeter.save.saveservice.output_format=xml -n -t /etc/tomcat/Catalina/parser/test.jmx -l /etc/tomcat/Catalina/parser/testres.jtl
如果JMeter的bin目录对jenkins用户没有权限,先执行以下命令授权:
sudo chown -R jenkins:jenkins /path/to/your/jmeter/bin sudo chmod -R 755 /path/to/your/jmeter/bin
3. 全局修改JMeter日志配置
编辑JMeter的bin/log4j2.xml配置文件,找到<File name="File" fileName="jmeter.log" append="false">这一行,修改fileName为jenkins用户有权限的路径:
<File name="File" fileName="/var/lib/jenkins/jmeter-logs/jmeter.log" append="false">
然后创建对应的目录并授权:
sudo mkdir -p /var/lib/jenkins/jmeter-logs sudo chown jenkins:jenkins /var/lib/jenkins/jmeter-logs
这个方法会全局生效,所有通过该JMeter实例执行的脚本都会使用这个日志路径,适合长期固定部署的场景。
验证
完成上述任一操作后,重新触发Jenkins构建。如果控制台不再输出权限错误,且testres.jtl和指定的jmeter.log正常生成,说明问题已解决。
内容的提问来源于stack exchange,提问作者Gog1nA

