Solaris

如何以非互動方式在 Solaris 上為非 root 使用者更新 crontab?

  • July 30, 2012

我想為作為 OpenPKG RPM 包安裝的應用程序更新非 root 使用者的 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 的方法。它不接受來自標準輸入的一個。
  • 我可以向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 正確的。

引用自:https://serverfault.com/questions/412424