6

Я запускаю этот простой скрипт на моем Raspberry Pi для автоматического обновления, поэтому я могу забыть об этом. Он также ведет журнал, в котором говорится, было ли обновление успешным. Сценарий update.sh:

#!/bin/bash
echo "Update starts on: $(date)" >> /home/pi/update.log
 if apt-get update && apt-get upgrade -y; then
    echo "update successful $(date)"  >> /home/pi/update.log
 else
    echo "Couldn't update $(date)" >> /home/pi/update.log
 fi

Я добавил этот скрипт в корневой crontab, используя sudo crontab -e и cronjob настроен на ежедневный запуск в 6 утра.

0 6 * * * /home/pi/update.sh

Я знаю, что это работает в некоторой степени, потому что запуск sudo ./update.sh в оболочке вручную запускает команды и оставляет "успешную" запись в журнале. С другой стороны, при запуске из crontab я всегда получаю запись "не могу обновить". В случае, если это имеет значение, сценарий «update.sh» был создан пользователем "pi", и я никогда не менял разрешения, кроме как предоставляя ему разрешения на выполнение.

Я прочитал еще один вопрос об этой же проблеме, и парень решил ее, поставив sudo перед командой. Он признает, что это странно, потому что он уже выполняется root, но говорит, что это работает. Я попытался добавить sudo и убедился, что он действительно работает сейчас.

кто-нибудь знает, почему это произошло? Зачем нужен sudo если он уже root?

2 ответа2

8

Cron запускает команды из специальной оболочки, отдельной от пользовательской или корневой оболочки. Эта оболочка не имеет доступа к тем же переменным PATH, что и пользователи. Поэтому при запуске скрипта в качестве задания cron есть две опции:

A. Укажите полный путь для каждой команды в скрипте (т. Е. Полный путь к aptitude-cron не знает, где искать «apt-get»)

Б. Небольшая хитрость, которую я использую - при написании строки работы cron, даже в crontab ROOT, добавьте sudo перед путем к скрипту. Это обманет cron при запуске сценария из корневой оболочки вместо оболочки cron, что даст ему доступ ко всем переменным PATH root.

1

Это связано с тем, что cron работает от имени вашего непривилегированного пользователя, а для выполнения команд apt-get требуются привилегии суперпользователя root (он же администрация).

Альтернативой является запуск этой команды в crontab пользователя root :

sudo -i
<type user password>
crontab -e

Первая команда поднимает всю вашу оболочку до уровня root и, что очень важно, предоставит вам доступ к среде root, а не только к одной команде как ваш пользователь с повышенными привилегиями.

Вторая команда будет редактировать корневой каталог, а не ваш собственный.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .