I Я не уверен в деталях канонической сортировки xml, и если она соответствует тому, что вы описали, однако я бы рекомендовал использовать xmllint
для выполнения канонической сортировки xml перед сохранением файла в системе управления версиями. Если вы последовательны в этом, то ваш контроль версий должен быть очень чистым и полезным. Вы можете переработать приведенный ниже материал, чтобы он был в сценарии, и если вы используете git, вы можете настроить githook
, чтобы запустить сценарий за вас.
$ xmllint --c14n originalConfig.xml > sortedConfig.xml
$ mv sortedConfig.xml originalConfig.xml
Приведенное выше должно сработать для вас, если вы используете Linux или Mac. Возможно, вам придется установить что-то вроде cygwin, если вы используете windows.
cron обычно запускается с помощью sh, а не bash, у них разные профили.
попробуйте запустить отдельный cron под bash, если у вас есть несколько пользовательских env vars, вы можете всегда env>/file, source /file в cron.
Обычно переменные среды должны быть определены в ~ / .profile
или ~ / .bash_profile
, если этот файл существует ваша оболочка входа в систему - bash.Так что загрузите этот файл из задания cron.
@reboot . ~/.profile; sleep 10 && /home/ubuntu/start.sh
~ / .bashrc
предназначен только для интерактивных настроек, поэтому вы не должны загружать его в неинтерактивном режиме, и обычно он все равно не будет работать. Если у вас есть определения переменных среды в .bashrc
, сначала исправьте этот беспорядок.
Еще одно место для установки переменных среды - ~ / .pam_environment
, если вы хотите, чтобы переменная имела постоянное значение (вы не можете запускать команды оболочки в этом файле).
См. Каков наилучший независимый от дистрибутива / оболочки способ установки переменных среды? , Разница между оболочкой входа и оболочкой без входа? и Есть ли ". bashrc "эквивалентный файл, читаемый всеми оболочками? для получения дополнительной информации о файлах запуска оболочки.
Я решил свою проблему следующим образом:
$ crontab -e
и добавить перед всеми остальными строками SHELL = / bin / bash
Это заставит cron использовать bash. Есть альтернативы , если вы хотите сделать это только для одной команды .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
...