cronによって呼び出され、rootとして実行されるシェルスクリプトがあります。
このスクリプトはログとデバッグ情報を出力し、ある時点で失敗しました。この点は、スクリプトが作成する出力の量によって異なります(たとえば、より多くのデバッグ出力を有効にすると、より早く失敗します)。
ただし、スクリプトをユーザーとして直接呼び出すと、問題なく機能します。
それ以来、問題を実証する簡略化されたテストケースを作成しました。
スクリプトは次のとおりです。
#!/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サブシェルを使用し、/ bin / trueを呼び出すことを推奨する他の検索もありますが、これが機能しなかっただけでなく、サブシェルオプションはメインスクリプトでは実行できません。
また、rootのファイル記述子の制限を変更しようとしましたが、それは役に立ちませんでした。スクリプトに#!/ bin / shと#!/ bin/bashの両方を使用してみました。
Ubuntu 10.04LTSでbash4.1.5(1)-releaseを使用しています。
回避策のアイデアや推奨事項をいただければ幸いです。