Как обновить 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.