是否有可能确定工作是否正在开始(通过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启动的脚本。