是否可以确定某项作业是否作为 at 作业启动(通过 atd/cron 启动)?

是否可以确定某项作业是否作为 at 作业启动(通过 atd/cron 启动)?

有没有办法识别脚本是作为 at 作业运行而不是由用户从 shell 交互运行?

我们的一些脚本有一个保护程序,通过检查 $TERM 来检查它们是否在屏幕上运行。我试图弄清楚我是否可以智能地检查脚本的执行是如何启动的,以便我可以更新该保护语句,或者我是否应该添加一个选项,该选项在从 at 作业运行时应始终包含在内。

答案1

您可以使用 ${PPID} 环境变量并在 ps 中查找来检查父进程名称。

答案2

为作业执行子系统启用日志记录。更具体地说,cron 和 at 默认会记录到 syslog,因此您只需确保记录的事件持久化即可。您可能需要将以下内容添加到 /etc/syslog.conf

## 将 cron 和 at 记录到 /var/adm/scheduled.log
cron.* /var/adm/scheduled.log

添加完这些后,重新启动 syslog 守护进程,使其获取新添加的配置参数。此时,您就有了已运行的计划作业的记录,并且可以将作业与其执行记录进行比较。[1]

要检查某个时间点的所有用户的日程安排,您可能需要执行以下操作,这将在 /tmp/schedulereport 的报告中列出他们的作业

取消链接 /tmp/schedulereport;
cat /etc/passwd |同时读取 ROW ; 执行
  登录=“$(echo ${ROW} |cut -d:-f1)”;
  SHELL="$(echo ${ROW} |cut -d: -f7)" ;
  [[ “${SHELL}” == '/sbin/nologin' && “${SHELL}” == '/bin/false' ]] \
    && ATJOBS='为非交互式用户跳过 AT 队列' \
    || ATJOBS="$(su - ${LOGIN} -c 'atq' 2>/dev/null)" ;
  [[ “${SHELL}” == '/sbin/nologin' && “${SHELL}” == '/bin/false' ]] \
    && CRONJOBS='为非交互式用户跳过 CRON 队列' \
    || CRONJOBS="$(su - ${LOGIN} -c'crontab -l' 2>/dev/null)" ;
  echo -e "${LOGIN}:\nAT:\n${ATJOBS}\n\nCRON:\n${CRONJOBS}\n\n=====\n >>/tmp/schedulereport " ;
  ATJOBS ='';
  CRONJOBS ='';
完毕

当然,如果您想阻止未经授权的用户安排作业,您可以只将授权用户添加到“cron.allow”和“at.allow”,所有未列出的用户将无法运行“crontab”或“at”或“batch”命令。


1:请注意,星号表示调试级日志记录,可能会非常冗长。如果日志中充满了无法执行的信息,您可能需要将“*”替换为“info”

答案3

另一个选择是使用pstree

$ pstree -lp | grep crond
        |-crond(2059)-+-crond(4445)---sh(4452)
        |             `-crond(4446)---sh(4453)

在这种情况下,PID 4452 和 4453 都是通过 crond 启动的脚本。

相关内容