有没有一种方法来确定一个脚本是作为一个工作而不是从用户的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启动的脚本。