Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Obecná podpora => Téma založeno: pavlix78 30 Dubna 2015, 14:27:49

Název: Test cron.daily - žádost o spolupráci
Přispěvatel: pavlix78 30 Dubna 2015, 14:27:49
Vážení přátelé pokud by jste si našli chvilku a spustily kontrolu cron.daily a napsali mi zda je vše v pořádku. Již u 3. nové instalace Ubuntu 14.04 (včetně nových aktualizací), cron.daily nedoběhne dokonce a zasekne se u úlohy apt. Je potřeba přeinstalovat libcrack2 a cracklib-runtime. Nevím zda bylo nutné, ale doinstaloval jsem i cron-apt. Potom vše proběhne v pořádku.
Pravděpodobně se jedná o bug, a tak vás ještě jednou žádám o test.

Kód: [Vybrat]
sudo -i
Kód: [Vybrat]
run-parts -v  /etc/cron.daily/
po případě

Kód: [Vybrat]
run-parts -v --reverse /etc/cron.daily/
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: Martin Šácha 30 Dubna 2015, 14:47:28
A že bys třeba dal výpis co ti ty příkazy vypíšou? A co vůbec v tom CRONu máš?
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: pavlix78 30 Dubna 2015, 14:53:41
Kód: [Vybrat]
root@BlackBOX:~# run-parts -v --reverse /etc/cron.daily/
run-parts: executing /etc/cron.daily//upstart
run-parts: executing /etc/cron.daily//update-notifier-common
run-parts: executing /etc/cron.daily//trim
run-parts: executing /etc/cron.daily//popularity-contest
run-parts: executing /etc/cron.daily//passwd
run-parts: executing /etc/cron.daily//mlocate
run-parts: executing /etc/cron.daily//man-db
run-parts: executing /etc/cron.daily//logrotate
run-parts: executing /etc/cron.daily//dpkg
run-parts: executing /etc/cron.daily//cracklib-runtime
run-parts: executing /etc/cron.daily//bsdmainutils
run-parts: executing /etc/cron.daily//apt
run-parts: executing /etc/cron.daily//apport
run-parts: executing /etc/cron.daily//0anacron
root@BlackBOX:~#

takto je to po zásahu, před tím se cron sekne na úloze apt. Jediné co jsem přidával je úloha na fstrim

Kód: [Vybrat]
#!/bin/sh
LOG=/var/log/trim.log
echo "*** $(date -R) ***" >> $LOG
fstrim -v / >> $LOG
fstrim -v /home >> $LOG
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: pavlix78 30 Dubna 2015, 20:45:55
Stáhl jsem nové médium nainstaloval ve VB a kupodivu to samé   :o.
Cron.daily se seká u apt a nedoběhne do konce.
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: GdH 01 Května 2015, 11:16:13
U mě žádný problém, systém rok starý.
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: pavlix78 01 Května 2015, 11:21:52
Díky za reakci, bude se pravděpodobně jednat o chybu u nové instalace 14.04.2. Bohužel starší instalace mi nikde neběží. Momentálně prolézám launchpad a podobnej bug tam nenacházím. Reporting bude pro mě s mojí ang. trošku problém, ale musím se s tím trošku popasovat. Ale pokud máte někdo zkušenosti reportněte to za mě. Protože jestli mám pravdu jedná se o závažnou chybku.
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: ntz_reloaded 01 Května 2015, 11:42:11
zjisti, v cem je chyba, na cem to visi ... dej sem obsah toho apt, pokud je to shellovy skript, tak kdyz do nej das na zacatek tohle, tak ti to vytvori soubor ve var/tmp, ve kterem bude zadenikovano, o co se pokousel

Kód: [Vybrat]
set -x
exec 2>/var/tmp/`basename $0`.debug
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: pavlix78 01 Května 2015, 12:42:10
apt
Kód: [Vybrat]
#!/bin/sh
#set -e
#
set -x
exec 2>/var/tmp/`basename $0`.debug
# This file understands the following apt configuration variables:
# Values here are the default.
# Create /etc/apt/apt.conf.d/02periodic file to set your preference.
#
#  Dir "/";
#  - RootDir for all configuration files
#
#  Dir::Cache "var/cache/apt/";
#  - Set apt package cache directory
#
#  Dir::Cache::Archives "archives/";
#  - Set package archive directory
#
#  APT::Periodic::Enable "1";
#  - Enable the update/upgrade script (0=disable)
#
#  APT::Periodic::BackupArchiveInterval "0";
#  - Backup after n-days if archive contents changed.(0=disable)
#
#  APT::Periodic::BackupLevel "3";
#  - Backup level.(0=disable), 1 is invalid.
#
#  Dir::Cache::Backup "backup/";
#  - Set periodic package backup directory
#
#  APT::Archives::MaxAge "0"; (old, deprecated)
#  APT::Periodic::MaxAge "0"; (new)
#  - Set maximum allowed age of a cache package file. If a cache
#    package file is older it is deleted (0=disable)
#
#  APT::Archives::MinAge "2"; (old, deprecated)
#  APT::Periodic::MinAge "2"; (new)
#  - Set minimum age of a package file. If a file is younger it
#    will not be deleted (0=disable). Useful to prevent races
#    and to keep backups of the packages for emergency.
#
#  APT::Archives::MaxSize "0"; (old, deprecated)
#  APT::Periodic::MaxSize "0"; (new)
#  - Set maximum size of the cache in MB (0=disable). If the cache
#    is bigger, cached package files are deleted until the size
#    requirement is met (the oldest packages will be deleted
#    first).
#
#  APT::Periodic::Update-Package-Lists "0";
#  - Do "apt-get update" automatically every n-days (0=disable)
#   
#  APT::Periodic::Download-Upgradeable-Packages "0";
#  - Do "apt-get upgrade --download-only" every n-days (0=disable)
#
#  APT::Periodic::Download-Upgradeable-Packages-Debdelta "1";
#  - Use debdelta-upgrade to download updates if available (0=disable)
#
#  APT::Periodic::Unattended-Upgrade "0";
#  - Run the "unattended-upgrade" security upgrade script
#    every n-days (0=disabled)
#    Requires the package "unattended-upgrades" and will write
#    a log in /var/log/unattended-upgrades
#
#  APT::Periodic::AutocleanInterval "0";
#  - Do "apt-get autoclean" every n-days (0=disable)
#
#  APT::Periodic::Verbose "0";
#  - Send report mail to root
#      0:  no report             (or null string)
#      1:  progress report       (actually any string)
#      2:  + command outputs     (remove -qq, remove 2>/dev/null, add -d)
#      3:  + trace on           

check_stamp()
{
    stamp="$1"
    interval="$2"

    if [ $interval -eq 0 ]; then
debug_echo "check_stamp: interval=0"
# treat as no time has passed
        return 1
    fi

    if [ ! -f $stamp ]; then
debug_echo "check_stamp: missing time stamp file: $stamp."
# treat as enough time has passed
        return 0
    fi

    # compare midnight today to midnight the day the stamp was updated
    stamp_file="$stamp"
    stamp=$(date --date=$(date -r $stamp_file --iso-8601) +%s 2>/dev/null)
    if [ "$?" != "0" ]; then
        # Due to some timezones returning 'invalid date' for midnight on
        # certain dates (e.g. America/Sao_Paulo), if date returns with error
        # remove the stamp file and return 0. See coreutils bug:
        # http://lists.gnu.org/archive/html/bug-coreutils/2007-09/msg00176.html
        rm -f "$stamp_file"
        return 0
    fi

    now=$(date --date=$(date --iso-8601) +%s 2>/dev/null)
    if [ "$?" != "0" ]; then
        # As above, due to some timezones returning 'invalid date' for midnight
        # on certain dates (e.g. America/Sao_Paulo), if date returns with error
        # return 0.
        return 0
    fi

    delta=$(($now-$stamp))

    # interval is in days, convert to sec.
    interval=$(($interval*60*60*24))
    debug_echo "check_stamp: interval=$interval, now=$now, stamp=$stamp, delta=$delta (sec)"

    # remove timestamps a day (or more) in the future and force re-check
    if [ $stamp -gt $(($now+86400)) ]; then
         echo "WARNING: file $stamp_file has a timestamp in the future: $stamp"
         rm -f "$stamp_file"
         return 0
    fi

    if [ $delta -ge $interval ]; then
        return 0
    fi

    return 1
}

update_stamp()
{
    stamp="$1"
    touch $stamp
}

# we check here if autoclean was enough sizewise
check_size_constraints()
{
    MaxAge=0
    eval $(apt-config shell MaxAge APT::Archives::MaxAge)
    eval $(apt-config shell MaxAge APT::Periodic::MaxAge)

    MinAge=2
    eval $(apt-config shell MinAge APT::Archives::MinAge)
    eval $(apt-config shell MinAge APT::Periodic::MinAge)

    MaxSize=0
    eval $(apt-config shell MaxSize APT::Archives::MaxSize)
    eval $(apt-config shell MaxSize APT::Periodic::MaxSize)

    Cache="/var/cache/apt/archives/"
    eval $(apt-config shell Cache Dir::Cache::archives/d)

    # sanity check
    if [ -z "$Cache" ]; then
echo "empty Dir::Cache::archives, exiting"
exit
    fi

    # check age
    if [ ! $MaxAge -eq 0 ] && [ ! $MinAge -eq 0 ]; then
debug_echo "aged: ctime <$MaxAge and mtime <$MaxAge and ctime>$MinAge and mtime>$MinAge"
find $Cache -name "*.deb"  \( -mtime +$MaxAge -and -ctime +$MaxAge \) -and -not \( -mtime -$MinAge -or -ctime -$MinAge \) -print0 | xargs -r -0 rm -f
    elif [ ! $MaxAge -eq 0 ]; then
debug_echo "aged: ctime <$MaxAge and mtime <$MaxAge only"
find $Cache -name "*.deb"  -ctime +$MaxAge -and -mtime +$MaxAge -print0 | xargs -r -0 rm -f
    else
debug_echo "skip aging since MaxAge is 0"
    fi
   
    # check size
    if [ ! $MaxSize -eq 0 ]; then
# maxSize is in MB
MaxSize=$(($MaxSize*1024))

#get current time
now=$(date --date=$(date --iso-8601) +%s)
MinAge=$(($MinAge*24*60*60))

# reverse-sort by mtime
for file in $(ls -rt $Cache/*.deb 2>/dev/null); do
    du=$(du -s $Cache)
    size=${du%%/*}
    # check if the cache is small enough
    if [ $size -lt $MaxSize ]; then
debug_echo "end remove by archive size:  size=$size < $MaxSize"
break
    fi

    # check for MinAge of the file
    if [ $MinAge -ne 0 ]; then
# check both ctime and mtime
mtime=$(stat -c %Y $file)
ctime=$(stat -c %Z $file)
if [ $mtime -gt $ctime ]; then
    delta=$(($now-$mtime))
else
    delta=$(($now-$ctime))
fi
if [ $delta -le $MinAge ]; then
    debug_echo "skip remove by archive size:  $file, delta=$delta < $MinAge"
    break
else
    # delete oldest file
    debug_echo "remove by archive size: $file, delta=$delta >= $MinAge (sec), size=$size >= $MaxSize"
    rm -f $file
fi
    fi
done
    fi
}

# deal with the Apt::Periodic::BackupArchiveInterval
do_cache_backup()
{
    BackupArchiveInterval="$1"
    if [ $BackupArchiveInterval -eq 0 ]; then
return
    fi

    # Set default values and normalize
    CacheDir="/var/cache/apt"
    eval $(apt-config shell CacheDir Dir::Cache/d)
    CacheDir=${CacheDir%/}
    if [ -z "$CacheDir" ]; then
debug_echo "practically empty Dir::Cache, exiting"
return 0
    fi

    Cache="${CacheDir}/archives/"
    eval $(apt-config shell Cache Dir::Cache::Archives/d)
    if [ -z "$Cache" ]; then
debug_echo "practically empty Dir::Cache::archives, exiting"
return 0
    fi

    BackupLevel=3
    eval $(apt-config shell BackupLevel APT::Periodic::BackupLevel)
    if [ $BackupLevel -le 1 ]; then
BackupLevel=2 ;
    fi
   
    Back="${CacheDir}/backup/"
    eval $(apt-config shell Back Dir::Cache::Backup/d)
    if [ -z "$Back" ]; then
echo "practically empty Dir::Cache::Backup, exiting" 1>&2
return
    fi

    CacheArchive="$(basename "${Cache}")"
    test -n "${CacheArchive}" || CacheArchive="archives"
    BackX="${Back}${CacheArchive}/"
    for x in $(seq 0 1 $((${BackupLevel}-1))); do
eval "Back${x}=${Back}${x}/"
    done
   
    # backup after n-days if archive contents changed.
    # (This uses hardlink to save disk space)
    BACKUP_ARCHIVE_STAMP=/var/lib/apt/periodic/backup-archive-stamp
    if check_stamp $BACKUP_ARCHIVE_STAMP $BackupArchiveInterval; then
if [ $({(cd $Cache 2>/dev/null; find . -name "*.deb"); (cd $Back0 2>/dev/null;find . -name "*.deb") ;}| sort|uniq -u|wc -l) -ne 0 ]; then
    mkdir -p $Back
    rm -rf $Back$((${BackupLevel}-1))
    for y in $(seq $((${BackupLevel}-1)) -1 1); do
eval BackY=${Back}$y
eval BackZ=${Back}$(($y-1))
if [ -e $BackZ ]; then
    mv -f $BackZ $BackY ;
fi
    done
    cp -la $Cache $Back ; mv -f $BackX $Back0
    update_stamp $BACKUP_ARCHIVE_STAMP
    debug_echo "backup with hardlinks. (success)"
else
    debug_echo "skip backup since same content."
fi
    else
debug_echo "skip backup since too new."
    fi
}

# sleep for a random interval of time (default 30min)
# (some code taken from cron-apt, thanks)
random_sleep()
{
    RandomSleep=1800
    eval $(apt-config shell RandomSleep APT::Periodic::RandomSleep)
    if [ $RandomSleep -eq 0 ]; then
return
    fi
    if [ -z "$RANDOM" ] ; then
        # A fix for shells that do not have this bash feature.
RANDOM=$(( $(dd if=/dev/urandom bs=2 count=1 2> /dev/null | cksum | cut -d' ' -f1) % 32767 ))
    fi
    TIME=$(($RANDOM % $RandomSleep))
    debug_echo "sleeping for $TIME seconds"
    sleep $TIME
}


debug_echo()
{
    # Display message if $VERBOSE >= 1
    if [ "$VERBOSE" -ge 1 ]; then
echo $1 1>&2
    fi
}

check_power(){
    # laptop check, on_ac_power returns:
    #       0 (true)    System is on main power
    #       1 (false)   System is not on main power
    #       255 (false) Power status could not be determined
    # Desktop systems always return 255 it seems
    if which on_ac_power >/dev/null; then
        on_ac_power
        POWER=$?
        if [ $POWER -eq 1 ]; then
    debug_echo "exit: system NOT on main power"
    return 1
        elif [ $POWER -ne 0 ]; then
    debug_echo "power status ($POWER) undetermined, continuing"
        fi
        debug_echo "system is on main power."
    fi
    return 0
}

# ------------------------ main ----------------------------

if test -r /var/lib/apt/extended_states; then
    # Backup the 7 last versions of APT's extended_states file
    # shameless copy from dpkg cron
    if cd /var/backups ; then
if ! cmp -s apt.extended_states.0 /var/lib/apt/extended_states; then
    cp -p /var/lib/apt/extended_states apt.extended_states
    savelog -c 7 apt.extended_states >/dev/null
fi
    fi
fi

# check apt-config existence
if ! which apt-config >/dev/null ; then
exit 0
fi

# check if the user really wants to do something
AutoAptEnable=1  # default is yes
eval $(apt-config shell AutoAptEnable APT::Periodic::Enable)

if [ $AutoAptEnable -eq 0 ]; then
    exit 0
fi

# Set VERBOSE mode from  apt-config (or inherit from environment)
VERBOSE=0
eval $(apt-config shell VERBOSE APT::Periodic::Verbose)
debug_echo "verbose level $VERBOSE"
if [ "$VERBOSE" -le 2 ]; then
    # quiet for 0,1,2
    XSTDOUT=">/dev/null"
    XSTDERR="2>/dev/null"
    XAPTOPT="-qq"
    XUUPOPT=""
else
    XSTDOUT=""
    XSTDERR=""
    XAPTOPT=""
    XUUPOPT="-d"
fi
if [ "$VERBOSE" -ge 3 ]; then
    # trace output
    set -x
fi

check_power || exit 0

# check if we can lock the cache and if the cache is clean
if which apt-get >/dev/null && ! eval apt-get check $XAPTOPT $XSTDERR ; then
    debug_echo "error encountered in cron job with \"apt-get check\"."
    exit 0
fi

# Global current time in seconds since 1970-01-01 00:00:00 UTC
now=$(date +%s)

# Support old Archive for compatibility.
# Document only Periodic for all controlling parameters of this script.

UpdateInterval=0
eval $(apt-config shell UpdateInterval APT::Periodic::Update-Package-Lists)

DownloadUpgradeableInterval=0
eval $(apt-config shell DownloadUpgradeableInterval APT::Periodic::Download-Upgradeable-Packages)

UnattendedUpgradeInterval=0
eval $(apt-config shell UnattendedUpgradeInterval APT::Periodic::Unattended-Upgrade)

AutocleanInterval=0
eval $(apt-config shell AutocleanInterval APT::Periodic::AutocleanInterval)

BackupArchiveInterval=0
eval $(apt-config shell BackupArchiveInterval APT::Periodic::BackupArchiveInterval)

Debdelta=1
eval $(apt-config shell Debdelta APT::Periodic::Download-Upgradeable-Packages-Debdelta)

# check if we actually have to do anything that requires locking the cache
if [ $UpdateInterval -eq 0 ] &&
   [ $DownloadUpgradeableInterval -eq 0 ] &&
   [ $UnattendedUpgradeInterval -eq 0 ] &&
   [ $BackupArchiveInterval -eq 0 ] &&
   [ $AutocleanInterval -eq 0 ]; then

    # check cache size
    check_size_constraints

    exit 0
fi

# deal with BackupArchiveInterval
do_cache_backup $BackupArchiveInterval

# sleep random amount of time to avoid hitting the
# mirrors at the same time
random_sleep
check_power || exit 0

# include default system language so that "apt-get update" will
# fetch the right translated package descriptions
if [ -r /etc/default/locale ]; then
    . /etc/default/locale
    export LANG LANGUAGE LC_MESSAGES LC_ALL
fi

# update package lists
UPDATED=0
UPDATE_STAMP=/var/lib/apt/periodic/update-stamp
if check_stamp $UPDATE_STAMP $UpdateInterval; then
    # check for a new archive signing key (against the master keyring)
    if eval apt-key net-update $XSTDERR; then
       debug_echo "apt-key net-update (success)"
    else
       debug_echo "apt-key net-update (failure)"
    fi
    # run apt-get update
    if eval apt-get $XAPTOPT -y update $XSTDERR; then
debug_echo "download updated metadata (success)."
if which dbus-send >/dev/null && pidof dbus-daemon >/dev/null; then
    if dbus-send --system / app.apt.dbus.updated boolean:true ; then
debug_echo "send dbus signal (success)"
    else
debug_echo "send dbus signal (error)"
    fi
else
    debug_echo "dbus signal not send (command not available)"
fi
update_stamp $UPDATE_STAMP
UPDATED=1
        # now run apt-xapian-index if it is installed to ensure the index
        # is up-to-date
        if [ -x /usr/sbin/update-apt-xapian-index ]; then
            nice ionice -c3 update-apt-xapian-index -q -u
        fi
    else
debug_echo "download updated metadata (error)"
    fi
else
    debug_echo "download updated metadata (not run)."
fi

# download all upgradeable packages (if it is requested)
DOWNLOAD_UPGRADEABLE_STAMP=/var/lib/apt/periodic/download-upgradeable-stamp
if [ $UPDATED -eq 1 ] && check_stamp $DOWNLOAD_UPGRADEABLE_STAMP $DownloadUpgradeableInterval; then
    if [ $Debdelta -eq 1 ]; then
        debdelta-upgrade >/dev/null 2>&1 || true
    fi
    if  eval apt-get $XAPTOPT -y -d dist-upgrade $XSTDERR; then
update_stamp $DOWNLOAD_UPGRADEABLE_STAMP
debug_echo "download upgradable (success)"
    else
debug_echo "download upgradable (error)"
    fi
else
    debug_echo "download upgradable (not run)"
fi

# auto upgrade all upgradeable packages
UPGRADE_STAMP=/var/lib/apt/periodic/upgrade-stamp
if which unattended-upgrade >/dev/null && check_stamp $UPGRADE_STAMP $UnattendedUpgradeInterval; then
    if unattended-upgrade $XUUPOPT; then
update_stamp $UPGRADE_STAMP
debug_echo "unattended-upgrade (success)"
    else
debug_echo "unattended-upgrade (error)"
    fi
else
    debug_echo "unattended-upgrade (not run)"
fi

# autoclean package archive
AUTOCLEAN_STAMP=/var/lib/apt/periodic/autoclean-stamp
if check_stamp $AUTOCLEAN_STAMP $AutocleanInterval; then
    if  eval apt-get $XAPTOPT -y autoclean $XSTDERR; then
debug_echo "autoclean (success)."
update_stamp $AUTOCLEAN_STAMP
    else
debug_echo "autoclean (error)"
    fi
else
    debug_echo "autoclean (not run)"
fi

# check cache size
check_size_constraints

#
#     vim: set sts=4 ai :
#
#!/bin/sh
#set -e
#
# This file understands the following apt configuration variables:
# Values here are the default.
# Create /etc/apt/apt.conf.d/02periodic file to set your preference.
#
#  Dir "/";
#  - RootDir for all configuration files
#
#  Dir::Cache "var/cache/apt/";
#  - Set apt package cache directory
#
#  Dir::Cache::Archives "archives/";
#  - Set package archive directory
#
#  APT::Periodic::Enable "1";
#  - Enable the update/upgrade script (0=disable)
#
#  APT::Periodic::BackupArchiveInterval "0";
#  - Backup after n-days if archive contents changed.(0=disable)
#
#  APT::Periodic::BackupLevel "3";
#  - Backup level.(0=disable), 1 is invalid.
#
#  Dir::Cache::Backup "backup/";
#  - Set periodic package backup directory
#
#  APT::Archives::MaxAge "0"; (old, deprecated)
#  APT::Periodic::MaxAge "0"; (new)
#  - Set maximum allowed age of a cache package file. If a cache
#    package file is older it is deleted (0=disable)
#
#  APT::Archives::MinAge "2"; (old, deprecated)
#  APT::Periodic::MinAge "2"; (new)
#  - Set minimum age of a package file. If a file is younger it
#    will not be deleted (0=disable). Useful to prevent races
#    and to keep backups of the packages for emergency.
#
#  APT::Archives::MaxSize "0"; (old, deprecated)
#  APT::Periodic::MaxSize "0"; (new)
#  - Set maximum size of the cache in MB (0=disable). If the cache
#    is bigger, cached package files are deleted until the size
#    requirement is met (the oldest packages will be deleted
#    first).
#
#  APT::Periodic::Update-Package-Lists "0";
#  - Do "apt-get update" automatically every n-days (0=disable)
#   
#  APT::Periodic::Download-Upgradeable-Packages "0";
#  - Do "apt-get upgrade --download-only" every n-days (0=disable)
#
#  APT::Periodic::Download-Upgradeable-Packages-Debdelta "1";
#  - Use debdelta-upgrade to download updates if available (0=disable)
#
#  APT::Periodic::Unattended-Upgrade "0";
#  - Run the "unattended-upgrade" security upgrade script
#    every n-days (0=disabled)
#    Requires the package "unattended-upgrades" and will write
#    a log in /var/log/unattended-upgrades
#
#  APT::Periodic::AutocleanInterval "0";
#  - Do "apt-get autoclean" every n-days (0=disable)
#
#  APT::Periodic::Verbose "0";
#  - Send report mail to root
#      0:  no report             (or null string)
#      1:  progress report       (actually any string)
#      2:  + command outputs     (remove -qq, remove 2>/dev/null, add -d)
#      3:  + trace on           

check_stamp()
{
    stamp="$1"
    interval="$2"

    if [ $interval -eq 0 ]; then
debug_echo "check_stamp: interval=0"
# treat as no time has passed
        return 1
    fi

    if [ ! -f $stamp ]; then
debug_echo "check_stamp: missing time stamp file: $stamp."
# treat as enough time has passed
        return 0
    fi

    # compare midnight today to midnight the day the stamp was updated
    stamp_file="$stamp"
    stamp=$(date --date=$(date -r $stamp_file --iso-8601) +%s 2>/dev/null)
    if [ "$?" != "0" ]; then
        # Due to some timezones returning 'invalid date' for midnight on
        # certain dates (e.g. America/Sao_Paulo), if date returns with error
        # remove the stamp file and return 0. See coreutils bug:
        # http://lists.gnu.org/archive/html/bug-coreutils/2007-09/msg00176.html
        rm -f "$stamp_file"
        return 0
    fi

    now=$(date --date=$(date --iso-8601) +%s 2>/dev/null)
    if [ "$?" != "0" ]; then
        # As above, due to some timezones returning 'invalid date' for midnight
        # on certain dates (e.g. America/Sao_Paulo), if date returns with error
        # return 0.
        return 0
    fi

    delta=$(($now-$stamp))

    # interval is in days, convert to sec.
    interval=$(($interval*60*60*24))
    debug_echo "check_stamp: interval=$interval, now=$now, stamp=$stamp, delta=$delta (sec)"

    # remove timestamps a day (or more) in the future and force re-check
    if [ $stamp -gt $(($now+86400)) ]; then
         echo "WARNING: file $stamp_file has a timestamp in the future: $stamp"
         rm -f "$stamp_file"
         return 0
    fi

    if [ $delta -ge $interval ]; then
        return 0
    fi

    return 1
}

update_stamp()
{
    stamp="$1"
    touch $stamp
}

# we check here if autoclean was enough sizewise
check_size_constraints()
{
    MaxAge=0
    eval $(apt-config shell MaxAge APT::Archives::MaxAge)
    eval $(apt-config shell MaxAge APT::Periodic::MaxAge)

    MinAge=2
    eval $(apt-config shell MinAge APT::Archives::MinAge)
    eval $(apt-config shell MinAge APT::Periodic::MinAge)

    MaxSize=0
    eval $(apt-config shell MaxSize APT::Archives::MaxSize)
    eval $(apt-config shell MaxSize APT::Periodic::MaxSize)

    Cache="/var/cache/apt/archives/"
    eval $(apt-config shell Cache Dir::Cache::archives/d)

    # sanity check
    if [ -z "$Cache" ]; then
echo "empty Dir::Cache::archives, exiting"
exit
    fi

    # check age
    if [ ! $MaxAge -eq 0 ] && [ ! $MinAge -eq 0 ]; then
debug_echo "aged: ctime <$MaxAge and mtime <$MaxAge and ctime>$MinAge and mtime>$MinAge"
find $Cache -name "*.deb"  \( -mtime +$MaxAge -and -ctime +$MaxAge \) -and -not \( -mtime -$MinAge -or -ctime -$MinAge \) -print0 | xargs -r -0 rm -f
    elif [ ! $MaxAge -eq 0 ]; then
debug_echo "aged: ctime <$MaxAge and mtime <$MaxAge only"
find $Cache -name "*.deb"  -ctime +$MaxAge -and -mtime +$MaxAge -print0 | xargs -r -0 rm -f
    else
debug_echo "skip aging since MaxAge is 0"
    fi
   
    # check size
    if [ ! $MaxSize -eq 0 ]; then
# maxSize is in MB
MaxSize=$(($MaxSize*1024))

#get current time
now=$(date --date=$(date --iso-8601) +%s)
MinAge=$(($MinAge*24*60*60))

# reverse-sort by mtime
for file in $(ls -rt $Cache/*.deb 2>/dev/null); do
    du=$(du -s $Cache)
    size=${du%%/*}
    # check if the cache is small enough
    if [ $size -lt $MaxSize ]; then
debug_echo "end remove by archive size:  size=$size < $MaxSize"
break
    fi

    # check for MinAge of the file
    if [ $MinAge -ne 0 ]; then
# check both ctime and mtime
mtime=$(stat -c %Y $file)
ctime=$(stat -c %Z $file)
if [ $mtime -gt $ctime ]; then
    delta=$(($now-$mtime))
else
    delta=$(($now-$ctime))
fi
if [ $delta -le $MinAge ]; then
    debug_echo "skip remove by archive size:  $file, delta=$delta < $MinAge"
    break
else
    # delete oldest file
    debug_echo "remove by archive size: $file, delta=$delta >= $MinAge (sec), size=$size >= $MaxSize"
    rm -f $file
fi
    fi
done
    fi
}

# deal with the Apt::Periodic::BackupArchiveInterval
do_cache_backup()
{
    BackupArchiveInterval="$1"
    if [ $BackupArchiveInterval -eq 0 ]; then
return
    fi

    # Set default values and normalize
    CacheDir="/var/cache/apt"
    eval $(apt-config shell CacheDir Dir::Cache/d)
    CacheDir=${CacheDir%/}
    if [ -z "$CacheDir" ]; then
debug_echo "practically empty Dir::Cache, exiting"
return 0
    fi

    Cache="${CacheDir}/archives/"
    eval $(apt-config shell Cache Dir::Cache::Archives/d)
    if [ -z "$Cache" ]; then
debug_echo "practically empty Dir::Cache::archives, exiting"
return 0
    fi

    BackupLevel=3
    eval $(apt-config shell BackupLevel APT::Periodic::BackupLevel)
    if [ $BackupLevel -le 1 ]; then
BackupLevel=2 ;
    fi
   
    Back="${CacheDir}/backup/"
    eval $(apt-config shell Back Dir::Cache::Backup/d)
    if [ -z "$Back" ]; then
echo "practically empty Dir::Cache::Backup, exiting" 1>&2
return
    fi

    CacheArchive="$(basename "${Cache}")"
    test -n "${CacheArchive}" || CacheArchive="archives"
    BackX="${Back}${CacheArchive}/"
    for x in $(seq 0 1 $((${BackupLevel}-1))); do
eval "Back${x}=${Back}${x}/"
    done
   
    # backup after n-days if archive contents changed.
    # (This uses hardlink to save disk space)
    BACKUP_ARCHIVE_STAMP=/var/lib/apt/periodic/backup-archive-stamp
    if check_stamp $BACKUP_ARCHIVE_STAMP $BackupArchiveInterval; then
if [ $({(cd $Cache 2>/dev/null; find . -name "*.deb"); (cd $Back0 2>/dev/null;find . -name "*.deb") ;}| sort|uniq -u|wc -l) -ne 0 ]; then
    mkdir -p $Back
    rm -rf $Back$((${BackupLevel}-1))
    for y in $(seq $((${BackupLevel}-1)) -1 1); do
eval BackY=${Back}$y
eval BackZ=${Back}$(($y-1))
if [ -e $BackZ ]; then
    mv -f $BackZ $BackY ;
fi
    done
    cp -la $Cache $Back ; mv -f $BackX $Back0
    update_stamp $BACKUP_ARCHIVE_STAMP
    debug_echo "backup with hardlinks. (success)"
else
    debug_echo "skip backup since same content."
fi
    else
debug_echo "skip backup since too new."
    fi
}

# sleep for a random interval of time (default 30min)
# (some code taken from cron-apt, thanks)
random_sleep()
{
    RandomSleep=1800
    eval $(apt-config shell RandomSleep APT::Periodic::RandomSleep)
    if [ $RandomSleep -eq 0 ]; then
return
    fi
    if [ -z "$RANDOM" ] ; then
        # A fix for shells that do not have this bash feature.
RANDOM=$(( $(dd if=/dev/urandom bs=2 count=1 2> /dev/null | cksum | cut -d' ' -f1) % 32767 ))
    fi
    TIME=$(($RANDOM % $RandomSleep))
    debug_echo "sleeping for $TIME seconds"
    sleep $TIME
}


debug_echo()
{
    # Display message if $VERBOSE >= 1
    if [ "$VERBOSE" -ge 1 ]; then
echo $1 1>&2
    fi
}

check_power(){
    # laptop check, on_ac_power returns:
    #       0 (true)    System is on main power
    #       1 (false)   System is not on main power
    #       255 (false) Power status could not be determined
    # Desktop systems always return 255 it seems
    if which on_ac_power >/dev/null; then
        on_ac_power
        POWER=$?
        if [ $POWER -eq 1 ]; then
    debug_echo "exit: system NOT on main power"
    return 1
        elif [ $POWER -ne 0 ]; then
    debug_echo "power status ($POWER) undetermined, continuing"
        fi
        debug_echo "system is on main power."
    fi
    return 0
}

# ------------------------ main ----------------------------

if test -r /var/lib/apt/extended_states; then
    # Backup the 7 last versions of APT's extended_states file
    # shameless copy from dpkg cron
    if cd /var/backups ; then
if ! cmp -s apt.extended_states.0 /var/lib/apt/extended_states; then
    cp -p /var/lib/apt/extended_states apt.extended_states
    savelog -c 7 apt.extended_states >/dev/null
fi
    fi
fi

# check apt-config existence
if ! which apt-config >/dev/null ; then
exit 0
fi

# check if the user really wants to do something
AutoAptEnable=1  # default is yes
eval $(apt-config shell AutoAptEnable APT::Periodic::Enable)

if [ $AutoAptEnable -eq 0 ]; then
    exit 0
fi

# Set VERBOSE mode from  apt-config (or inherit from environment)
VERBOSE=0
eval $(apt-config shell VERBOSE APT::Periodic::Verbose)
debug_echo "verbose level $VERBOSE"
if [ "$VERBOSE" -le 2 ]; then
    # quiet for 0,1,2
    XSTDOUT=">/dev/null"
    XSTDERR="2>/dev/null"
    XAPTOPT="-qq"
    XUUPOPT=""
else
    XSTDOUT=""
    XSTDERR=""
    XAPTOPT=""
    XUUPOPT="-d"
fi
if [ "$VERBOSE" -ge 3 ]; then
    # trace output
    set -x
fi

check_power || exit 0

# check if we can lock the cache and if the cache is clean
if which apt-get >/dev/null && ! eval apt-get check $XAPTOPT $XSTDERR ; then
    debug_echo "error encountered in cron job with \"apt-get check\"."
    exit 0
fi

# Global current time in seconds since 1970-01-01 00:00:00 UTC
now=$(date +%s)

# Support old Archive for compatibility.
# Document only Periodic for all controlling parameters of this script.

UpdateInterval=0
eval $(apt-config shell UpdateInterval APT::Periodic::Update-Package-Lists)

DownloadUpgradeableInterval=0
eval $(apt-config shell DownloadUpgradeableInterval APT::Periodic::Download-Upgradeable-Packages)

UnattendedUpgradeInterval=0
eval $(apt-config shell UnattendedUpgradeInterval APT::Periodic::Unattended-Upgrade)

AutocleanInterval=0
eval $(apt-config shell AutocleanInterval APT::Periodic::AutocleanInterval)

BackupArchiveInterval=0
eval $(apt-config shell BackupArchiveInterval APT::Periodic::BackupArchiveInterval)

Debdelta=1
eval $(apt-config shell Debdelta APT::Periodic::Download-Upgradeable-Packages-Debdelta)

# check if we actually have to do anything that requires locking the cache
if [ $UpdateInterval -eq 0 ] &&
   [ $DownloadUpgradeableInterval -eq 0 ] &&
   [ $UnattendedUpgradeInterval -eq 0 ] &&
   [ $BackupArchiveInterval -eq 0 ] &&
   [ $AutocleanInterval -eq 0 ]; then

    # check cache size
    check_size_constraints

    exit 0
fi

# deal with BackupArchiveInterval
do_cache_backup $BackupArchiveInterval

# sleep random amount of time to avoid hitting the
# mirrors at the same time
random_sleep
check_power || exit 0

# include default system language so that "apt-get update" will
# fetch the right translated package descriptions
if [ -r /etc/default/locale ]; then
    . /etc/default/locale
    export LANG LANGUAGE LC_MESSAGES LC_ALL
fi

# update package lists
UPDATED=0
UPDATE_STAMP=/var/lib/apt/periodic/update-stamp
if check_stamp $UPDATE_STAMP $UpdateInterval; then
    # check for a new archive signing key (against the master keyring)
    if eval apt-key net-update $XSTDERR; then
       debug_echo "apt-key net-update (success)"
    else
       debug_echo "apt-key net-update (failure)"
    fi
    # run apt-get update
    if eval apt-get $XAPTOPT -y update $XSTDERR; then
debug_echo "download updated metadata (success)."
if which dbus-send >/dev/null && pidof dbus-daemon >/dev/null; then
    if dbus-send --system / app.apt.dbus.updated boolean:true ; then
debug_echo "send dbus signal (success)"
    else
debug_echo "send dbus signal (error)"
    fi
else
    debug_echo "dbus signal not send (command not available)"
fi
update_stamp $UPDATE_STAMP
UPDATED=1
        # now run apt-xapian-index if it is installed to ensure the index
        # is up-to-date
        if [ -x /usr/sbin/update-apt-xapian-index ]; then
            nice ionice -c3 update-apt-xapian-index -q -u
        fi
    else
debug_echo "download updated metadata (error)"
    fi
else
    debug_echo "download updated metadata (not run)."
fi

# download all upgradeable packages (if it is requested)
DOWNLOAD_UPGRADEABLE_STAMP=/var/lib/apt/periodic/download-upgradeable-stamp
if [ $UPDATED -eq 1 ] && check_stamp $DOWNLOAD_UPGRADEABLE_STAMP $DownloadUpgradeableInterval; then
    if [ $Debdelta -eq 1 ]; then
        debdelta-upgrade >/dev/null 2>&1 || true
    fi
    if  eval apt-get $XAPTOPT -y -d dist-upgrade $XSTDERR; then
update_stamp $DOWNLOAD_UPGRADEABLE_STAMP
debug_echo "download upgradable (success)"
    else
debug_echo "download upgradable (error)"
    fi
else
    debug_echo "download upgradable (not run)"
fi

# auto upgrade all upgradeable packages
UPGRADE_STAMP=/var/lib/apt/periodic/upgrade-stamp
if which unattended-upgrade >/dev/null && check_stamp $UPGRADE_STAMP $UnattendedUpgradeInterval; then
    if unattended-upgrade $XUUPOPT; then
update_stamp $UPGRADE_STAMP
debug_echo "unattended-upgrade (success)"
    else
debug_echo "unattended-upgrade (error)"
    fi
else
    debug_echo "unattended-upgrade (not run)"
fi

# autoclean package archive
AUTOCLEAN_STAMP=/var/lib/apt/periodic/autoclean-stamp
if check_stamp $AUTOCLEAN_STAMP $AutocleanInterval; then
    if  eval apt-get $XAPTOPT -y autoclean $XSTDERR; then
debug_echo "autoclean (success)."
update_stamp $AUTOCLEAN_STAMP
    else
debug_echo "autoclean (error)"
    fi
else
    debug_echo "autoclean (not run)"
fi

# check cache size
check_size_constraints

#
#     vim: set sts=4 ai :
#

log

Kód: [Vybrat]
+ test -r /var/lib/apt/extended_states
+ cd /var/backups
+ cmp -s apt.extended_states.0 /var/lib/apt/extended_states
+ cp -p /var/lib/apt/extended_states apt.extended_states
+ savelog -c 7 apt.extended_states
+ which apt-config
+ AutoAptEnable=1
+ apt-config shell AutoAptEnable APT::Periodic::Enable
+ eval
+ [ 1 -eq 0 ]
+ VERBOSE=0
+ apt-config shell VERBOSE APT::Periodic::Verbose
+ eval
+ debug_echo verbose level 0
+ [ 0 -ge 1 ]
+ [ 0 -le 2 ]
+ XSTDOUT=>/dev/null
+ XSTDERR=2>/dev/null
+ XAPTOPT=-qq
+ XUUPOPT=
+ [ 0 -ge 3 ]
+ check_power
+ which on_ac_power
+ on_ac_power
+ POWER=255
+ [ 255 -eq 1 ]
+ [ 255 -ne 0 ]
+ debug_echo power status (255) undetermined, continuing
+ [ 0 -ge 1 ]
+ debug_echo system is on main power.
+ [ 0 -ge 1 ]
+ return 0
+ which apt-get
+ eval apt-get check -qq 2>/dev/null
+ apt-get check -qq
+ date +%s
+ now=1430476671
+ UpdateInterval=0
+ apt-config shell UpdateInterval APT::Periodic::Update-Package-Lists
+ eval UpdateInterval='1'
+ UpdateInterval=1
+ DownloadUpgradeableInterval=0
+ apt-config shell DownloadUpgradeableInterval APT::Periodic::Download-Upgradeable-Packages
+ eval DownloadUpgradeableInterval='0'
+ DownloadUpgradeableInterval=0
+ UnattendedUpgradeInterval=0
+ apt-config shell UnattendedUpgradeInterval APT::Periodic::Unattended-Upgrade
+ eval
+ AutocleanInterval=0
+ apt-config shell AutocleanInterval APT::Periodic::AutocleanInterval
+ eval AutocleanInterval='0'
+ AutocleanInterval=0
+ BackupArchiveInterval=0
+ apt-config shell BackupArchiveInterval APT::Periodic::BackupArchiveInterval
+ eval
+ Debdelta=1
+ apt-config shell Debdelta APT::Periodic::Download-Upgradeable-Packages-Debdelta
+ eval
+ [ 1 -eq 0 ]
+ do_cache_backup 0
+ BackupArchiveInterval=0
+ [ 0 -eq 0 ]
+ return
+ random_sleep
+ RandomSleep=1800
+ apt-config shell RandomSleep APT::Periodic::RandomSleep
+ eval
+ [ 1800 -eq 0 ]
+ [ -z  ]
+ dd if=/dev/urandom bs=2 count=1
+ cksum
+ cut -d  -f1
+ RANDOM=13491
+ TIME=891
+ debug_echo sleeping for 891 seconds
+ [ 0 -ge 1 ]
+ sleep 891

Nejsem programátor, ale připadá mi to jako když se to kousne když se snaží připojit k zrcadlu s aktualizacema.
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: Jakub Vaněk 01 Května 2015, 17:03:45
Mě se spíš nezdá random sleep, ale možná se mýlím, skript jsem jen přelétl očima.
Kód: [Vybrat]
+ sleep 891
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: GdH 01 Května 2015, 17:31:09
Ano, pokud log končí sleepem na pomalu 15 minut, možná by jen stačilo počkat. Ten random sleep je v pořádku, to je záměr, horní hranice je 30 minut, je kvůli rozložení zátěže serverů s repozitáři při spuštění většího množství systémů najednou. A pokud se úlohy cron.daily spouštějí synchronně, tak je jasné, že ty další holt musí počkat.
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: GdH 01 Května 2015, 18:36:32
Ještě jsem zjistil, že při spuštění na mém systému se funkce random_sleep vůbec ke slovu nedostane, ale jsem líný studovat zbytek kódu, který o tom rozhoduje.
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: pavlix78 01 Května 2015, 20:31:42
No ono stačí doinstalovat apt-cron a  přeinstalovat libcrack2 a cracklib-runtime. A proběhne to do 20 s.
Název: Re:Test cron.daily - žádost o spolupráci
Přispěvatel: pavlix78 03 Května 2015, 10:19:56
Asi na to nepřijdu, prosím uzavřít :'(