You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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》进行排查,结果如下:

  1. Cron守护进程运行正常
  2. Cron服务工作正常
  3. 脚本单独执行正常
  4. Cron能执行任务,无报错日志
  5. 目录及文件权限正常,具备写入权限
  6. 脚本中已使用实际路径,暂不确定是否存在路径遗漏
  7. 添加输出重定向到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:25:19