strange mail log cutting at 16:45 daily, incomplete mail logs

Discussion in 'Installation/Configuration' started by st2xo, Sep 11, 2006.

  1. st2xo

    st2xo New Member

    Hi - I have problems with a strange mail log behaviour:

    • the /var/log/mail.ispconfigsave contains the daily logs from 16:45 to 23:59 only.
      example: log entrys between Sep 9 23:59 and Sep 10 16:45 are missing
    • the daily logfiles /var/log/mail.info-YYYYMMDD.gz are containing
      the entries from 16:45 to 16:45
      example: mail.info-20060909.gz
      first entry: Sep 8 16:45:15
      last entry: Sep 9 16:45:02
    • Logrotation is as default:
      1. /etc/cron.daily/logrotate runs /etc/logrotate.conf
      2. /etc/logrotate.conf is default, contains nothing related to 16:45
        (only the default values: weekly, rotate 4, create)
      3. /etc/logrotate.d contains no postfix file
    • the ispconfig jobs in crontab are croned as default (23:59, 0:30, 0:40 etc.), there is no cronjob around 16:45 (nevertheless the ispconfig log-jobs are reading the logfiles only, not cutting them, right?)

    I would like to have the logfiles cutted at 0:00
    After looking for related threads here and asking google I´m quite confused now .....

    Can anybody help or give me a hint, a url ..... thanks in advance!
     
  2. till

    till Super Moderator Staff Member ISPConfig Developer

    ISPConfig is reading and copying the logfiles nightly, not at 16:45.
     
  3. falko

    falko Super Moderator Howtoforge Staff

    Did you check /etc/crontab?
     
  4. st2xo

    st2xo New Member

    Hi till&falko,

    sorry form my late reaction, was ill, no possibilty to check my mails

    Yes, the ispconfig cron jobs are all right and they´re default from the installation

    Code:
    59 23 * * * /root/ispconfig/php/php /root/ispconfig/scripts/shell/ftp_logs.php &> /dev/null
    59 23 * * * /root/ispconfig/php/php /root/ispconfig/scripts/shell/mail_logs.php &> /dev/null
    59 23 * * * /root/ispconfig/php/php /root/ispconfig/scripts/shell/cleanup.php &> /dev/null
    0,30 * * * * /root/ispconfig/php/php /root/ispconfig/scripts/shell/check_services.php &> /dev/null
    15 3,15 * * * /root/ispconfig/php/php /root/ispconfig/scripts/shell/quota_msg.php &> /dev/null
    30 00 * * * /root/ispconfig/php/php /root/ispconfig/scripts/shell/logs.php &> /dev/null
    40 00 * * * /root/ispconfig/php/php /root/ispconfig/scripts/shell/traffic.php &> /dev/null
    30 03 * * * /root/ispconfig/php/php /root/ispconfig/scripts/shell/backup.php &> /dev/null
    00 04 * * * /root/ispconfig/php/php /root/ispconfig/scripts/shell/webalizer.php &> /dev/null



    contains:

    Code:
    SHELL=/bin/sh
    PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
    MAILTO=root
    #
    # check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
    #
    -*/15 * * * *   root  test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1
    what I have to check?
     
  5. falko

    falko Super Moderator Howtoforge Staff

    This cron job runs every 15 minutes, so it also runs at 16.45h. What's the output of
    Code:
    ls -la /usr/lib/cron/run-crons
    ? If it's a file, what's in it?
     
  6. st2xo

    st2xo New Member

    Yes, but why not 15:30 oder 7:15 or something else?


    Code:
    [B]ls -la /usr/lib/cron/run-crons[/B]
    -rwxr--r--  1 root root 6054 Sep  9  2005 /usr/lib/cron/run-crons
    and

    Code:
    [B]more /usr/lib/cron/run-crons[/B]
    #!/bin/bash
    #
    # /usr/lib/cron/run-crons
    #
    # Copyright (c) 1998-2001 SuSE GmbH Nuernberg, Germany. All rights reserved.
    #
    # this script looks into /etc/cron.{hourly,daily,weekly,monthly} for
    # scripts to be executed.  The info about last run is stored in
    # /var/spool/cron/lastrun
    #
    # concept similar to debian and redhat
    #
    # Changes:
    #     1998 - Burchard Steinbild <[email protected]>, 1998
    #         initial version
    #     before 2001 - [email protected]
    #        send an email with name of date-script instead of cron entry
    #         "Subject: cronjob@www - daily - FAILURE"
    #        (better one script for each date-sub-script)
    #        requires changes to /etc/crontab
    #        append > /dev/null 2>&1  to the line calling run-cons
    #     2001-09-11
    #        updated to Suse 7.2 merged
    #     2001-09-12
    #        changed FAILURE detection, until now all scripts with output
    #        had "failed", now only scripts with error status != 0
    #        have failed.
    #     2001-09-13 - [email protected]
    #        merged with 7.3: call logger with exit value for scripts
    #        respect MAILTO as cron does
    #        use mktemp -d for all tmpfiles
    #        add variable to disable mail if all jobs returned 0
    #
    
    # set to "true" to send a mail even if all scripts returned OK
    SEND_MAIL_ON_NO_ERROR=false
    
    BASENAME=`/usr/bin/basename $0`
    LOGGER="/bin/logger -t $BASENAME[$$]"
    
    export LC_TIME=POSIX
    TMPDIR=`mktemp -d /tmp/run-crons.XXXXXX`
    trap "rm -rf $TMPDIR" 0 1 2 3 13 15
    
    # Priority change for sub scripts.
    # range: highest -20 ... 19 lowest prioriy
    #  default processes start in level 10
    CRON_SCRIPT_NICE_VALUE=15
    SPOOL=/var/spool/cron/lastrun
    
    # CRON Result EMail is sent to
    if test -z "$MAILTO" ; then
      SEND_TO="root"
    else
      SEND_TO="$MAILTO"
    fi
    
    #
    # Don't run jobs on laptops, that are AC-offline
    #
    if test -x /usr/bin/on_ac_power ; then
            on_ac_power -q
            if [ "$?" = "1" ]; then
                    exit 0
            fi
    fi
    
    mkdir -p $SPOOL
    
    #set verbose
    ## stage 1,  search directories/scripts to run
    RUN=""
    for CRONDIR in /etc/cron.{hourly,daily,weekly,monthly} ; do
        test -d $CRONDIR || continue
        BASE=${CRONDIR##*/}
        TIME_EXT=${BASE##cron.}
    
        test -e $SPOOL/$BASE && {
            case $BASE in
              cron.hourly)  TIME="-cmin  +60 -or -cmin  60" ;;
              cron.daily)   TIME="-cmin +1440 -or -cmin 1440"  ;;
              cron.weekly)  TIME="-cmin +10080 -or -cmin 10080"  ;;
              cron.monthly) NOW=`date +%s`
                            LASTMONTH=`date -d "last month" +%s`
                            DIFF=`expr '(' $NOW - $LASTMONTH ')' / 86400`
                            TIME="-ctime +$DIFF"
                            ;;
            esac
            # remove all lock files for scripts that are due to run
            eval find $SPOOL/$BASE $TIME | \
                 xargs --no-run-if-empty rm
        }
        if test ! -e $SPOOL/$BASE ; then
            # accept this dir, if it isn't empty
            LIST=`find $CRONDIR ! -type d`
            if [ ! -z "$LIST" ] ; then
                RUN="${RUN} ${TIME_EXT}"
            fi
        fi
    done
    
    
    ##  STATUS communication variable between
    #     function run_scripts ()
    #   and loop-over-all-scripts
    #   set in run_scripts to FAILURE if this script failed!
    #   else it is empty
    #   because it is never reset to empty after the initialization
    #   it implements an OR like logic over all scripts
    ##
    STATUS=""
    
    # helper, run all scripts in one cron directory
    function run_scripts (){
        local CRONDIR=$1
        local TIME_EXT=$2
    
    
        local TEMP_MSG=$TMPDIR/run-crons.${TIME_EXT}.$$
        rm -r $TMPDIR/run-crons.${TIME_EXT}.* >/dev/null 2>&1
    
        # keep going when something fails
        set +e
        for SCRIPT in $CRONDIR/* ; do
            test -d $SCRIPT && continue
            case "$SCRIPT" in
                   .svn)           continue ;;
                   *.rpm*)         continue ;;
                   *.swap)         continue ;;
                   *.bak)          continue ;;
                   *.orig)         continue ;;
                   \#*)            continue ;;
                   *~)             continue ;;
            esac
            /sbin/checkproc $SCRIPT && continue
            if test -x $SCRIPT ; then
                BASESCRIPT=`/usr/bin/basename $SCRIPT`
    
                nice -n ${CRON_SCRIPT_NICE_VALUE} $SCRIPT >$TEMP_MSG 2>&1
    
                local ERRNO=$?
                if [ 0 -eq $ERRNO ] ; then
                    # dummy action
                    echo "SCRIPT: $BASESCRIPT, OK."
                else
                    echo "$BASESCRIPT returned $ERRNO" | $LOGGER -p warn
                    echo "SCRIPT: $BASESCRIPT exited with RETURNCODE = $ERRNO."
                    STATUS="FAILURE"
                fi
                # write some wrapper text around the original output
                if [ -s "$TEMP_MSG" ] ; then
                    echo "SCRIPT: output (stdout && stderr) follows"
                    echo ""
                    cat $TEMP_MSG
                    echo -e "SCRIPT: $BASESCRIPT\n------- END OF OUTPUT"
                    echo ""
                    echo ""
                fi
    
                rm -f $TEMP_MSG > /dev/null 2>&1
            else
                echo "WARNING: $SCRIPT is not executable, script is ignored !"
            fi
        done
    }
    
    # stage 2:
    #   run all scripts  and collect output into one mail
    #   for each TIME_EXT with a meaningfull subject.
    #
    if [ ! -z "${RUN}"  ] ; then
        for EXT in ${RUN} ; do
            CRONDIR="/etc/cron."${EXT}
            test -d $CRONDIR || continue
            BASE=`/usr/bin/basename $CRONDIR`
            TIME_EXT=${BASE##cron.}
            STATUS=""
    
            if test ! -e $SPOOL/$BASE ; then
                CONTROL_MAIL=$TMPDIR/run-crons.$$
    
                echo "running ${TIME_EXT} cronjob scripts" >> ${CONTROL_MAIL}
                echo "" >> ${CONTROL_MAIL}
    
                touch $SPOOL/$BASE
    
                run_scripts  ${CRONDIR} ${TIME_EXT} >> ${CONTROL_MAIL} 2>&1
                TITLE="cronjob@$HOSTNAME - ${TIME_EXT}"
                if [ -n "${STATUS}" ] ; then
                    TITLE="${TITLE} - ${STATUS}"
                else
                    TITLE="${TITLE} - OK"
                fi
                if [ -n "${STATUS}" -o "$SEND_MAIL_ON_NO_ERROR" = true ] ; then
                    mail ${SEND_TO} -s "${TITLE}" < ${CONTROL_MAIL}
                fi
    
                rm -f ${CONTROL_MAIL}
            fi
        done
    fi
    
    #
    # now make sure, we have no lastrun files dated to future
    #
    touch $SPOOL
    NOW=`date -u +%s`
    for i in `find $SPOOL -type f`
    do
        FILEDATE=`date -u -r $i +%s`
        # allow for up to one hour in the future because of summer/wintertime
        if [ `expr $FILEDATE - $NOW` -gt 3600 ]
        then
            rm $i
        fi
    done
    
    /usr/lib/cron/run-crons is default from system- and ispconfig-installation, no changes on that file were made.

    and so on:

    Code:
    [B]ls -la /var/spool/cron/lastrun[/B]
    -rw-r--r--  1 root root    0 Sep 20 16:45 cron.daily
     

Share This Page