如何以非交互方式为 Solaris 上的非 root 用户更新 crontab?

如何以非交互方式为 Solaris 上的非 root 用户更新 crontab?

我想要为非 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 权限。

相关内容