заставить Cron работать в той же среде, что и я, используя ssh login

I Я не уверен в деталях канонической сортировки xml, и если она соответствует тому, что вы описали, однако я бы рекомендовал использовать xmllint для выполнения канонической сортировки xml перед сохранением файла в системе управления версиями. Если вы последовательны в этом, то ваш контроль версий должен быть очень чистым и полезным. Вы можете переработать приведенный ниже материал, чтобы он был в сценарии, и если вы используете git, вы можете настроить githook , чтобы запустить сценарий за вас.

$ xmllint --c14n originalConfig.xml > sortedConfig.xml
$ mv sortedConfig.xml originalConfig.xml

Приведенное выше должно сработать для вас, если вы используете Linux или Mac. Возможно, вам придется установить что-то вроде cygwin, если вы используете windows.

2
06.11.2016, 22:31
3 ответа

cron обычно запускается с помощью sh, а не bash, у них разные профили.

попробуйте запустить отдельный cron под bash, если у вас есть несколько пользовательских env vars, вы можете всегда env>/file, source /file в cron.

0
27.01.2020, 22:10

Обычно переменные среды должны быть определены в ~ / .profile или ~ / .bash_profile , если этот файл существует ваша оболочка входа в систему - bash.Так что загрузите этот файл из задания cron.

@reboot . ~/.profile; sleep 10 && /home/ubuntu/start.sh

~ / .bashrc предназначен только для интерактивных настроек, поэтому вы не должны загружать его в неинтерактивном режиме, и обычно он все равно не будет работать. Если у вас есть определения переменных среды в .bashrc , сначала исправьте этот беспорядок.

Еще одно место для установки переменных среды - ~ / .pam_environment , если вы хотите, чтобы переменная имела постоянное значение (вы не можете запускать команды оболочки в этом файле).

См. Каков наилучший независимый от дистрибутива / оболочки способ установки переменных среды? , Разница между оболочкой входа и оболочкой без входа? и Есть ли ". bashrc "эквивалентный файл, читаемый всеми оболочками? для получения дополнительной информации о файлах запуска оболочки.

2
27.01.2020, 22:10

Я решил свою проблему следующим образом:

  • запустить $ crontab -e и добавить перед всеми остальными строками SHELL = / bin / bash Это заставит cron использовать bash. Есть альтернативы , если вы хотите сделать это только для одной команды
  • my .bashrc , которая была по умолчанию для экземпляра AWS EC2 ubuntu, содержала следующие строки:

.

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

поэтому выполнение source /home/ubuntu/.bashrc ничего не сделает в задании cron. Кажется, это служит определенной цели, поэтому я не удалил его полностью, а заменил на:

# If not running interactively, don't do anything
if [ -z ${RUN_BASHRC+x} ]; then
  echo "might return";
else
  case $- in
      *i*) ;;
        *) return;;
  esac
fi

, который позволил мне установить флаг для обхода этого раннего возврата.

  • Наконец, по некоторым причинам ПУТЬ все еще не обновлялся правильно. Я мог бы исправить это, выполнив:

.

ADDITIONAL_PATH=$(sudo -Hiu ubuntu env | grep -oP "^PATH=\K.*")
PATH=$ADDITIONAL_PATH:$PATH

Я не уверен на 100%, что это делает :) но в итоге у меня такой же PATH , который я бы использовал при входе в систему с помощью ssh.

Итак, наконец:

crontab:

SHELL=/bin/bash
@reboot RUN_BASHRC=1 /home/ubuntu/startup.sh >> /home/ubuntu/cron-startup.logs

~ / .bashrc : замена выше

~ / start.sh :

#!/bin/bash
ADDITIONAL_PATH=$(sudo -Hiu ubuntu env | grep -oP "^PATH=\K.*")
PATH=$ADDITIONAL_PATH:$PATH
...
0
27.01.2020, 22:10

Теги

Похожие вопросы