Variables (definidas localmente) no definidas al ejecutar el script bash desde cron en MacOS

Variables (definidas localmente) no definidas al ejecutar el script bash desde cron en MacOS

Tengo el siguiente script para la creación de copias de seguridad:

#!/usr/bin/env bash
{
  declare -a directories=(
    "/Applications/Apache"
    "/Applications/Scripts"
  )

  function duplicateBackups()
  {
    from=`realpath $1`
    to=`realpath $2`
    echo [ `date +"%T"` ] Copying backups from $from to $to
    cp -r $1 $2/
    sleep 1
  }

  date=`date +"%Y-%m-%d"`

  destination1='/opt/Volumes/USB1'
  destination2='/opt/Volumes/USB2'
  destination3='/opt/Volumes/FireWire'
  destination4='/opt/Volumes/USB3'
  destinationFolder='MacMini-Backups'
  targetFolder=$destination1/$destinationFolder/$date

  mkdir $targetFolder
  targetPath=`realpath $targetFolder`

  echo [ `date +"%T"` ] Starting files backups

  for i in "${directories[@]}"
  do
    fileName="$(basename $i)"
    mkdir -p $targetFolder/Files/
    echo [ `date +"%T"` ] Backing up "$i" as "$targetPath/Files/$fileName.tgz"
    tar -Pczf $targetFolder/Files/$fileName.tgz -C $i .
    sleep 1
  done
  echo [ `date +"%T"` ] Files backups finished
  sleep 1
  echo [ `date +"%T"` ] Starting databases backup
  sleep 1

  mkdir -p $targetFolder/Databases/

  echo [ `date +"%T"` ] Backing up all databases into $targetPath/Databases/full-dump.sql.gz
  mysqldump --opt --all-databases --skip-lock-tables | gzip -c > $targetFolder/Databases/full-dump.sql.gz

  for db in `mysql -se "show databases;"`;
  do
    if [[ ${db} != *"schema"* ]]; then
      echo [ `date +"%T"` ] Backing up database $db into $targetPath/Databases/$db-dump.sql.gz
      mysqldump --skip-lock-tables --opt $db | gzip -c > $targetFolder/Databases/$db-dump.sql.gz
      sleep 1
    fi
  done;
  echo [ `date +"%T"` ] Databases backup finished
  sleep 1

  duplicateBackups $destination1/$destinationFolder/$date $destination2/$destinationFolder
  duplicateBackups $destination1/$destinationFolder/$date $destination3/$destinationFolder
  duplicateBackups $destination1/$destinationFolder/$date $destination4/$destinationFolder

} >> /Applications/Scripts/Logs/backups.log

Este script funciona absolutamente bien cuando lo ejecuto manualmente, sin importar si es desde Shell, bash o ZSH.

Así es como se ve el archivo de registro en ese caso:

[ 09:26:05 ] Starting files backups
[ 09:26:05 ] Backing up /Applications/Apache as /Volumes/USB1/MacMini-Backups/2020-12-31/Files/Apache.tgz
[ 09:27:14 ] Backing up /Applications/Scripts as /Volumes/USB1/MacMini-Backups/2020-12-31/Files/Scripts.tgz
[ 09:27:15 ] Files backups finished
[ 09:27:16 ] Starting databases backup
[ 09:27:17 ] Backing up all databases into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/full-dump.sql.gz
[ 09:27:35 ] Backing up database Cloud into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/Cloud-dump.sql.gz
[ 09:27:36 ] Backing up database mysql into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/mysql-dump.sql.gz
[ 09:27:38 ] Backing up database radek into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/site-dump.sql.gz
[ 09:27:41 ] Backing up database radek_j3 into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/site_j3-dump.sql.gz
[ 09:27:45 ] Backing up database test into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/test-dump.sql.gz
[ 09:27:46 ] Backing up database site_j3 into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/joomla_3-dump.sql.gz
[ 09:27:48 ] Backing up database joomla_dev into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/joomla_dev-dump.sql.gz
[ 09:27:49 ] Backing up database joomla_dev2 into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/joomla_dev2-dump.sql.gz
[ 09:27:51 ] Backing up database joomla_j4 into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/joomla_j4-dump.sql.gz
[ 09:27:53 ] Backing up database joomla_site into /Volumes/USB1/MacMini-Backups/2020-12-31/Databases/joomla_site-dump.sql.gz
[ 09:28:06 ] Databases backup finished
[ 09:28:07 ] Copying backups from /Volumes/USB1/MacMini-Backups/2020-12-31 to /Volumes/USB2/MacMini-Backups
[ 09:28:30 ] Copying backups from /Volumes/USB1/MacMini-Backups/2020-12-31 to /Volumes/FireWire/MacMini-Backups
[ 09:28:43 ] Copying backups from /Volumes/USB1/MacMini-Backups/2020-12-31 to /Volumes/USB3/MacMini-Backups

Sin embargo, si lo ejecutara a través de cronjob, Automator o incluso Apple Calendar, el archivo de registro se vería así:

[ 06:00:00 ] Starting files backups
[ 06:00:00 ] Backing up /Applications/Apache as /Files/Apache.tgz
[ 06:01:22 ] Backing up /Applications/Scripts as /Files/Scripts.tgz
[ 06:01:23 ] Files backups finished
[ 06:01:25 ] Starting databases backup
[ 06:01:26 ] Backing up all databases into /Databases/full-dump.sql.gz
[ 06:01:26 ] Databases backup finished
[ 06:01:27 ] Copying backups from to
[ 06:01:46 ] Copying backups from to
[ 06:01:58 ] Copying backups from to

Supongo que estas variables que definí en ese script no tienen ningún efecto.

¿Alguien sabe cuál puede ser el problema aquí?

Respuesta1

Muchas gracias abitineranteyMarcos Wagnerpor su ayuda. Después de agregar el resultado del error, resultó que era una combinación entre rutas faltantes y falta de permisos para acceder a directorios y leer la lista de bases de datos de MySQL.

Muchas gracias

información relacionada