使用 安排稍后运行的作业后at
,在给定时间atd
将报告“权限被拒绝”而不是启动作业。 /var/spool/cron/at* 的权限是正确的:
root@server /var/spool/cron # ls -la
total 20
drwxr-xr-x 5 root root 4096 Okt 30 2014 .
drwxr-xr-x 6 root root 4096 Okt 30 2014 ..
drwxrwx--T 2 daemon daemon 4096 Nov 1 17:57 atjobs
drwxrwx--T 2 daemon daemon 4096 Nov 1 17:57 atspool
drwx-wx--T 2 root crontab 4096 Nov 1 17:34 crontabs
当运行手动发送的命令时at
,一切都会正常工作。
答案1
在没有看到任何操作系统规范的情况下,我怀疑 SELinux 可能在起作用。
检查它是否已启用:getenforce
将返回Enforcing
。如果是,则以 root 身份运行setenforce permissive
,然后查看命令运行时是否出现权限被拒绝错误。
答案2
我正在寻找有关atd
运行原因的答案,但作业未能执行,日志中显示以下内容:
Nov 16 05:28:00 yourserver atd[15038]: Cannot create output file: Permission denied
系统是Debian 10 buster。
我注意到的一件事是该atd
进程以用户身份运行daemon
,这导致我:为什么 Debian 将“atd”作为“daemon”用户运行?
好的。
事实证明,man atd
文件部分中有一些有用的信息。
/var/spool/cron/atjobs The directory for storing jobs; this should be mode 700, owner daemon.
/var/spool/cron/atspool The directory for storing output; this should be mode 700, owner daemon.
一旦我确保这些目录具有这些权限和所有权,事情就开始按预期进行。
对于这个特定的系统,我认为at
这个系统并不经常使用(所以直到现在才发现这个问题)。该系统已经从更旧的 Debian 版本升级了多年,因此当从atd
root 运行更改为守护进程时,这些目录似乎从未收到正确的(更新的)权限和所有权。