我们有一个由 cron 调用并以 root 身份运行的 shell 脚本。
此脚本输出日志记录和调试信息,并且在某一时刻失败了。这一点取决于脚本创建的输出量(例如,如果我们启用更多调试输出,它会更快地失败)。
但是,如果以用户身份直接调用脚本,则它可以正常工作。
我们已经创建了一个简化的测试用例来演示这个问题。
脚本是:
#!/bin/bash
function log_so () {
local msg="$1"
if [ -z "${LOG_FILE}" ] ; then warn_so "It's pointless use log_so() if LOG_FILE variable is undefined!" ; return 1 ; fi
echo -e "${msg}"
echo -e "${msg}" >> ${LOG_FILE}
(
/bin/true
)
}
LOG_FILE="/usr/local/bin/log_bla"
linenum=1
while [[ $linenum -lt 2000 ]] ; do
log_so "short text: $linenum"
let linenum++
done
死亡前达到的最高值是 244(当通过 cron 调用时)。
其他一些搜索建议使用函数中的 no-op 子 shell 并调用 /bin/true ,但这不仅不起作用,而且 subshell 选项在主脚本中也不可行。
我们还尝试更改 root 的文件描述符限制,但这没有帮助,并尝试将 #!/bin/sh 和 #!/bin/bash 用于脚本。
我们在 Ubuntu 10.04 LTS 上使用 bash 4.1.5(1)-release。
任何解决方法的想法或建议将不胜感激。