У меня есть сценарий резервного копирования для моих серверов, и есть переключатель резервного копирования баз данных 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
.