我想要为非 root 用户更新作为 OpenPKG RPM 包安装的应用程序的 crontab 条目。
%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。它不接受来自标准输入的 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) 不接受任何信号来重新读取 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 权限。