Назад | Перейти на главную страницу

Почему мой сценарий резервного копирования работает, когда я его запускаю, но не работает через cron?

Это мой сценарий, backup_mongo.sh

#!/bin/bash
suffix=$(date +%w)
rm /home/myuser/backup/mongo-$suffix -rf
mkdir /home/myuser/backup/mongo-$suffix
mongodump -h$1 -u$2 -p$3 -dmydb -o/home/myuser/backup/mongo-$suffix

В моем crontab -e:

0   3  *   *   *    /bin/bash  /home/myuser/myproject/production/backup_mongo.sh  localhost user1 pass1

Когда я запускаю сценарий в обычном режиме (выполняя команду выше), сценарий работает, и каталог «mydb» создается в / mongo- $ suffix.

Однако, когда я помещаю это в crontab, создается суффикс / mongo- $, но каталог «mydb» не существует. В суффиксе / mongo- $ нет ничего.

У вас может не быть mongodump в твоем PATH. Попробуйте использовать абсолютный путь к mongodump команда.

Скорее всего, это проблема с PATH, но я бы рекомендовал НЕ переопределять PATH в вашем crontab, потому что это

  • действительно легко избежать поведения
  • может быть угроза безопасности

Его хороший стиль кодирования bash / sh для определения каждого двоичного файла, который вы хотите запускать, с полным путем в качестве переменной.

!#/bin/bash

RSYNC="/usr/bin/rsync"

и обратимся к переменной позже.

$RSYNC /foo/bar baz

Также существуют определенные параметры для изменения пользователя, выполняющего crontab. Предполагая, что существует пользователь с именем mongodump, который определил PATH, включающий mongodump, вы можете стать этим пользователем и отредактировать его crontab. Или вы также можете использовать

/bin/bash /bin/su - mongodump -c /bin/bash /home/myuser/myproject/production/backup_mongo.sh

в crontab корней.

ПУТЬ по умолчанию для cron ограничен. Это обычно /usr/bin:/bin. Если вы хотите запустить что-либо за пределами этих каталогов, у вас есть несколько вариантов

Используйте полные пути к командам, например /path/to/mongodump/mongodump ...

Определите расширенный PATH в crontab, например.

    PATH=/usr/bin:/bin/:/path/to/mongodump
    0 3 * * * /bin/bash  /home/myuser/myproject/production/backup_mongo.sh  localhost user1 pass1

Определите ПУТЬ в скрипте, который вы запускаете

#!/bin/bash
PATH=/usr/bin:/bin:/paath/to/mongodump
suffix=$(date +%w)
rm /home/myuser/backup/mongo-$suffix -rf
mkdir /home/myuser/backup/mongo-$suffix
mongodump -h$1 -u$2 -p$3 -dmydb -o/home/myuser/backup/mongo-$suffix