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

Как обновить crontab для пользователя без полномочий root в Solaris в неинтерактивном режиме?

Я хотел бы обновить записи crontab для пользователя без полномочий root для приложения, которое устанавливается как пакет OpenPKG RPM.

В настоящее время у меня есть это в %post раздел моего файла .spec:

#
# Set up the 'app' user's crontab.
# Marker lines are used to separate content from different packages:
#     #Begin of App package
#     # ...
#     #End of App package
# Replace any possibly existing content between these lines and insert the
# content of the installed new file
CRONTAB=/var/spool/cron/crontabs/%{V_user}
if [ -f $CRONTAB ]; then
    begin=`head -1 %{V_instdir}/etc/crontab`
    end=`tail -1 %{V_instdir}/etc/crontab`
    if [ -z "$begin" ] || [ -z "$end" ]; then
        echo "Error: Start or end delimiter line is empty. Check '%{V_instdir}/etc/crontab'"
        exit 1
    fi
    sed -e "/^$begin/,/^$end/d" $CRONTAB > $CRONTAB.tmp
    cat %{V_instdir}/etc/crontab >> $CRONTAB.tmp
    mv $CRONTAB.tmp $CRONTAB
else
    cp %{V_instdir}/etc/crontab $CRONTAB
fi
chown root:sys $CRONTAB
chmod 600 $CRONTAB

Это не работает: файл создается правильно, но cron не подхватывает изменения. Я полагаю, что нельзя редактировать файл в /var/spool/cron прямо.

Как правильно редактировать crontab?

Операционная система - Solaris 10. У меня нет root-доступа. Кто-то другой должен установить созданный мной RPM-пакет.

К сожалению, cron (1M) не принимает никаких сигналов для повторного чтения crontab. Инструмент crontab (1) взаимодействует с cron посредством межпроцессного взаимодействия (см. источник). Тем не менее, похоже, что crontab, вероятно, лучший инструмент, который вы можете использовать для изменения crontab пользователя. Вы можете написать сценарий, который добавляет / удаляет / изменяет crontab, и использовать его следующим образом:

EDITOR=<your script> crontab -e <user>

Сценарий принимает один аргумент, имя файла, который содержит копию crontab этого пользователя, обрабатывает файл и завершает работу с кодом возврата 0. Затем crontab сообщит cron, что crontab пользователя был изменен. Однако, если у вас останется пустой crontab, вам нужно изменить стратегии и использовать

crontab -r <user>

вместо. Немного раздражает.

Другой вариант - просто перезапустить cron после внесения изменений с помощью

svcadm restart cron

но для этого требуется su или хотя бы право solaris.smf.manage.cron.