Я хотел бы обновить записи 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?
crontab
На странице руководства не упоминается способ загрузки 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-пакет.
К сожалению, 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.