Я решил свою проблему следующим образом:
$ 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
...