有没有办法识别脚本是作为 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 启动的脚本。