Bash-скрипт, не обнаруживающий mysqld, установлен, но работает при запуске вручную - PullRequest
0 голосов
/ 10 июня 2019

У меня есть сценарий резервного копирования для моих серверов, и есть переключатель резервного копирования баз данных mysql, если установлен mysqld.

# If flag is set and executable is installed
if [[ "$flag_s" -eq 1 ]]; then
  printf "STATE: Detected flag -s\n" >> "$logfile"
  if [[ -x "$(command -v mysqld)" ]]; then
    printf "STATE: Starting backup of MySQL databases\n" >> "$logfile"
    mysqldump --defaults-extra-file=/custom/files/my.cnf --single-transaction -u root --all-databases | gzip > "$backup_dir"/"$hostname"_"$datetime"_all_mysql_dbs.gz;
  else
    printf "ERROR: mysqld not installed\n" >> "$logfile"
  fi
fi

Однако при запуске из crontab root выполняется оператор else. В журнале я вижу ERROR: mysqld not installed, хотя mysqld определенно установлен. Остальная часть сценария работает нормально (например, резервное копирование каталогов и т. Д.).

Если я запускаю приведенный ниже код от имени root, он правильно показывает mysqld как установленный.

root@db03:~# if [[ -x "$(command -v mysqld)" ]]; then
>   printf "STATE: Starting backup of MySQL databases\n"
> else
>   printf "ERROR: mysqld not installed\n"
> fi
STATE: Starting backup of MySQL databases

Кроме того, если я запускаю весь скрипт от имени root, он работает правильно. Сбой только при запуске из crontab. Что мне не хватает? Нужна ли переменная окружения? Это проблема с PATH root?

root@db03:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Это работает на Ubuntu 18.04 LTS с пакетом bash 4.4.18-2ubuntu1.1.

1 Ответ

1 голос
/ 10 июня 2019

Попробуйте - добавьте:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

где-то в верхней части файла crontab.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...