1

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を使用しています。

回避策のアイデアや推奨事項をいただければ幸いです。

4

1 に答える 1

1

手で fd を開き、後でクリーンアップするのはどうですか? テストするbash 4.1はありませんが、役立つかもしれません。

LOG_FILE="/usr/local/bin/log_bla"

exec 9<> "$LOG_FILE"

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}" >&9
    return 0
}

linenum=1
while [[ $linenum -lt 2000 ]] ; do
  log_so "short text: $linenum"
  let linenum++
done

exec 9>&-
于 2012-05-02T16:58:29.317 に答える