Bash脚本手动执行正常,Cronjob执行生成空文件求助
Cron执行Bash脚本生成空文件问题
问题描述
有一个Bash脚本,功能包括:
- 创建文件
- 读取所有XML文件
- 提取特定信息写入
.txt文件
手动执行./mappingToText.sh时,autorisaties.txt正常生成且包含XML中的相关内容;但通过crontab执行该脚本时,文件虽能生成,但内容为空(0字节)。
已尝试的解决方案
- 使用
>&/>>和2>&1直接写入文件 - 参考相关案例修改代码
- 脚本中使用完整路径
- 在crontab中添加
SHELL=/bin/bash
Cron任务配置
35 11 * * * /opt/IBM/taddm/dist/var/policy/ibmsecauthz/policy/rolemapping/AuthorizationManagerPolicyContextId_role/mappingToText.sh
脚本内容(注释已翻译)
#!/bin/bash #日志文件路径 LOGFILE=/opt/IBM/taddm/dist/var/policy/ibmsecauthz/policy/rolemapping/AuthorizationManagerPolicyContextId_role/autorisaties.txt #检查日志文件是否存在 if test -f "$LOGFILE"; then #日志文件存在则删除 rm $LOGFILE fi #日志文件不存在则创建 touch $LOGFILE #设置文件权限(测试用,后续可能移除) chmod 777 $LOGFILE #不使用该命令时问题仍存在 #遍历所有XML文件 for FILE in *; do #筛选文件名包含"principal"的文件 #if [ $FILE == *"principal"* ]; then if echo $FILE | grep -q "principal"; then #从XML文件中提取用户名(字符串) name=$(xmlstarlet sel -T -t -m "//*[local-name()='Subject']/*[local-name()='SubjectMatch']/*[local-name()='AttributeValue']/*[local-name()='DataValue']/*[local-name()='SimpleValue']" -v . $FILE) #从XML文件中提取角色(数组) roles=$(xmlstarlet sel -T -t -m "//*[local-name()='Condition']/*[local-name()='Apply']/*[local-name()='AttributeValue']/*[local-name()='DataValue']/*[local-name()='SimpleValue']" -v . -n $FILE) #代码片段:数组排序 IFS=$'\n' sortedRoles=($(sort <<<"${roles[*]}")) unset IFS #辅助变量 previousRole="" #遍历角色数组 for i in "${sortedRoles[@]}" do #过滤重复角色(XML中可能存在重复项) if [ "$i" != "$previousRole" ] ; then #获取日志时间戳 date=$(date +%Y-%m-%d_%H:%M:%S) #将下划线(_)替换为空格 adjustedDate=${date//[_]/ } #将权限信息写入日志文件 echo $adjustedDate " - 用户名: " $name " - 用户角色: " $i >> $LOGFILE fi previousRole=$i done fi done
后续排查结果
参考《CronJob not running》进行排查,结果如下:
- Cron守护进程运行正常
- Cron服务工作正常
- 脚本单独执行正常
- Cron能执行任务,无报错日志
- 目录及文件权限正常,具备写入权限
- 脚本中已使用实际路径,暂不确定是否存在路径遗漏
- 添加输出重定向到
cron.out后,cron.out和autorisaties.txt均为0字节
调整后的Cron配置
48 12 * * * /opt/IBM/taddm/dist/var/policy/ibmsecauthz/policy/rolemapping/AuthorizationManagerPolicyContextId_role/mappingToText.sh >>/opt/IBM/taddm/dist/var/policy/ibmsecauthz/policy/rolemapping/AuthorizationManagerPolicyContextId_role/cron.out 2>&1
文件列表输出
-rw-r--r--. 1 root root 0 Jan 13 12:48 autorisaties.txt -rw-r--r--. 1 root root 0 Jan 13 12:48 cron.out
请求帮助
如何让该脚本在cronjob中正常工作?
内容的提问来源于stack exchange,提问作者Niek Jonkman
相关产品推荐
相关产品推荐

