是否有可能确定工作是否正在开始(通过atd / cron启动)?

有没有一种方法来确定一个脚本是作为一个工作而不是从用户的shell交互式运行?

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

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

启用作业执行子系统的日志logging。 更具体地说,cron和at会默认loginsyslog,所以你只需要确保logging的事件是持久的。 您可能需要将以下内容添加到/etc/syslog.conf中

  ## Log cron和at /var/adm/scheduled.log
 cron。* /var/adm/scheduled.log 

添加后,重新启动系统日志守护进程,使他拿起新添加的configuration参数。 在这一点上,你有一个已经运行的计划任务的logging,并可以比较一个工作和执行logging。 [1]

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

取消链接/ tmp / schedulereport;
 cat / etc / passwd | while read ROW; 做 
   LOGIN =“$(echo $ {ROW} | cut -d:-f1)”; 
   SHELL =“$(echo $ {ROW} | cut -d:-f7)”; 
   [['$ {SHELL}“=='/ sbin / nologin'&&”$ {SHELL}“=='/ bin / false']] \
     && ATJOBS ='为非交互式用户跳过队列'\
     ||  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 ='';
 DONE

当然,如果你想阻止没有授权的用户进行日程安排,那么你只能将授权用户添加到“cron.allow”和“at.allow”,所有没有列出的用户都不能运行“crontab “或”at“或”batch“命令。


1:请注意,星号表示debugging级别的日志logging,可能会变得非常冗长。 如果日志中填充了不可执行的信息,则可能需要将“*”replace为“info”

另一个select是使用pstree

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

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