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

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

В настоящее время у меня есть это в %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?

  • crontab Страница man не упоминает способ загрузки файла crontab для пользователя. Он не принимает один из стандартного ввода.
  • Могу ли я подать сигнал cron демон для перечитывания файлов crontab?
  • Или я должен использовать suвдоль линий

    su %{V_user} -c "crontab -l > $tmpfile"
    # Make the changes
    su %{V_user} -c "crontab $tmpfile"
    

    Не произойдет ли это, если целевой пользователь не имеет прав на редактирование своего собственного файла crontab?

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

1 ответ

Решение

К сожалению, cron(1M) не принимает никаких сигналов для перечитывания crontabs. Инструмент 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.

Другие вопросы по тегам