Bootstrap

Linux cron 任务 不执行/cron 任务详解

1. cron任务不执行:

hostname cron.d]$ sudo crond reload       
crond: can't lock /var/run/crond.pid, otherpid may be 20585: Resource temporarily unavailable

(1). pgrep crond  查看当前时刻正在运行的corn任务

[zengtai.csm@hostname cron.d]$ pgrep crond
20585
22298
pgrep   应该是查询 进程pid的命令
说明可能两个cron任务同时运行;


(2). check cron任务的:

sudo tail -f /var/log/cron

[[email protected] pat]$ sudo tail /var/log/cron     
Aug 21 19:26:01  crond[666]: (root) CMD (/home/a/bin/kfc_gather -p 2905 -g tanx_gae  > /dev/null 2>&1)
Aug 21 19:26:01 crond[671]: (root) CMD (/home/a/bin/kfc_gather -p 2905 -g xengine  > /dev/null 2>&1)
Aug 21 19:26:01  crond[674]: (root) CMD (/home/a/bin/kfc_gather -p 2905 -g adpost  > /dev/null 2>&1)
Aug 21 19:26:01  crond[676]: (root) CMD (chmod o+r /opt/csr/tair/sbin/logs/server.log)
Aug 21 19:26:01  crond[679]: (timetunnel) CMD (/home/timetunnel/logcenter/logagent/runLogAgent.sh >/dev/null 2>&1)
Aug 21 19:27:01  crond[865]: (root) CMD (chmod o+r /opt/csr/tair/sbin/logs/server.log)

注:只要在这个log里面出现的命令就说明cron任务执行了



(3). 重启cron任务

sudo /etc/init.d/crond restart

 /sbin/service crond stop
  /sbin/service crond start

sudo service crond stop/start



2. 查询问题:

/home/a/bin/kfc_gather -p 2905 -g adpost 
sudo /home/a/bin/kfc_gather -p 2905 -g adpost 
strace -s 10000 -f -o /tmp/t /home/a/bin/kfc_gather -p 2905 -g adpost 
vim /tmp/t
kfcstat localhost 2905 1
strace -s 10000 -o /tmp/t -f kfcstat localhost 2905 1

strace -s 数量  -o  输出文件    后面是一个命令;则会把后面的命令答应到stdout,但把命令在进程的所有信息输出到文件中;通过查文件来看命令都做了什么事情



3. crontab  任务不执行,首先要查询一下cron任务的宿主和语法:

  (1). /etc/cron.d/cron_zengtai   这个文件必须是 root:root  否则cron_zengtai  不会执行

  (2). cron的语法,如果语法错误也不会执行:

* * * * *  

----具体cron任务没有执行,sudo tail -f /var/log/cron


4. cron 脚本是从别的机器复制的则 scp -p zengtai.csm@...:/etc/cron.d/test_cron

    则这个cron任务的时间属性不变,这个cron任务有可能不执行;需要我们touch一下

   sudo touch ../cron


5. cron 任务:

   这段时间的运维过程中,发现了几个crontab使用雷区。

 (1).      写好的程序,手动执行没问题,上crontab就报错

Crontab任务的执行环境与手动执行时的执行环境不同。

手动执行时,任务的执行环境为当前用户或指定用户的执行环境,典型的执行环境是环境变量,此时环境变量可以用env查看。Crontab调度时,执行环境的环境变量大为缩减,如下为用root用户执行crontab任务时的环境变量

 

SHELL=/bin/sh

USER=root

PATH=/usr/bin:/bin

PWD=/root

SHLVL=1

HOME=/root

LOGNAME=root

_=/usr/bin/env

 

所以,编码时,尽量通过全路径名引用文件或调用命令,或者将引用的文件或者命令的路径添加到环境变量中

 

(2).       Crontab任务的输出重定向文件无写权限

通常情况下,在添加crontab任务之前,都会手动执行一下待添加的crontab任务,此时,通过重定向产生的文件,只执行该任务的用户有写权限,由sudo -u指定的用户并没有写权限。本质原因是sudo –u对重定向符不起作用。如此,在添加crontab任务,以sudo –u中指定的用户身份运行时,由于对重定向文件无写权限,crontab任务会安静的失败

 

(3).       Crontab任务配置文件owner不是root

在添加crontab任务时,如果配置文件owner不是root,任务会失败(志遥以前也提起过),不过这种失败,可以在cron日志中看到如下错误信息:

 

(*system*)WRONG FILE OWNER

 

(4)       Crontab任务配置文件为单行

Crontab任务都是单行,可如果配在配置文件中,任务字符串后没有换行符,这个任务就有可能也会静悄悄地失败。为安全起见,建议多一下按下回车键

 

(5). 

1 cron会忽略点系统的i18n,默认使用posix的来decode,导致awk识别错误

2 crontab file %”要转义


;