1. 程式人生 > >Linux cron 任務 不執行/cron 任務詳解

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任務

[[email protected] 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 [email protected]:/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 %”要轉義