linux crontab下的指令碼不執行怎麼辦

germany006發表於2019-08-19

在工作中經常會遇到一些狀況,比如寫好的  shell  指令碼手工執行很正常,但一旦把其配置在  crontab  上排程就會出現這樣或那樣的問題。本人就遇到到如下幾種情況。

、在呼叫  oracle  的  sqlplus  、  sqlldr  等命令工具時必須寫出其全路徑才能在  crontab  中執行成功,否則,雖然手動執行很正常,但一配到  crontab  上就出現異常。

、手動執行  shell  指令碼時,可以用  sh  命令;但在  cron  中一定不能用  sh  執行命令,而要用直接的列出  shell  指令碼檔案的方式順序執行。

、在  crontab  呼叫時,如果有用到資料庫,最好把資料庫的相關環境變數等列寫出來。

、要在  crontab  裡排程,  shell  指令碼中引用到的檔案最好都寫絕對路徑。

5、如果是ORACLE資料庫的指令碼,一定要注意環境變數,例如 
PATH=$PATH:$HOME/bin 
export PATH 
export TMP=/tmp 
export TMPDIR=/tmp 
export ORACLE_BASE=/oracle/app 
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 
export ORACLE_SID=racdb1 
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH 
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" 

6、 檢查crond程式是否正常

/etc/init.d/crond status  (貌似centos7版本沒有這個命令)

/etc/init.d/crond start

service rsyslog status

ps -elf|grep crond


centos7

service crond status

service crond start

service crond status

7、如何判斷crontab是否執行,可以看這個日誌 /var/log/cron (貌似centos7版本沒有這個命令)

8、如果是root使用者下執行,環境變數可以設定加上這兩行

. /etc/profile

. ~/.bash_profile


手動執行指令碼成功,crontab不執行,可以新增以下

if [ -f ~/.bash_profile ];

then

  . ~/.bash_profile

fi

9、如果是grails程式的啟動
nohup grails prod run-app -Dserver.port=xxxx --non-interactive 2>&1 > nohup.out &




為了這個指令碼能成功執行,新增了N多的環境變數,

這裡關於 grails就新增了java相關的環境變數。


#!/bin/bash


#設定環境變數

#root使用者環境變數

. /etc/profile

. ~/.bash_profile

#java環境變數

JAVA_HOME=/home/app/jdk1.7.0_71

JAVA_OPTS="-Xmx1024m -XX:MaxPermSize=512M"

GRAILS_HOME=/home/app/grails-2.3.11

MAVEN_HOME=/home/app/apache-maven-3.0.5

export JAVA_HOME JAVA_OPTS GRAILS_HOME MAVEN_HOME

PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:$GRAILS_HOME/bin:$MAVEN_HOME/bin

export PATH


#查詢9898的程式ID

process_id1=$(echo $(ps -ef | grep server.port=9898 | grep -v grep | awk '{print $2}'))

process_id2=`ps -ef | grep rule-service-api1 | grep -v grep |grep -v '/home/app/rule-service-api1/restart_9898.sh'| awk '{print $2}'`

count=$(echo $(ps -ef | grep server.port=9898 | grep -v grep | awk '{print $2}'|wc -l))


#判斷程式是否存在,重啟該程式

if [ $count -eq 0 ];

then

cd /home/app/rule-service-api1/

sh /home/app/rule-service-api1/startup-rule.sh > /opt/restart9898_1.log 2>&1

sleep 10

echo 'start successful' >> /opt/restart9898_1.log

date >> /opt/restart9898_1.log

else

kill -9 $process_id1 $process_id2

sleep 10

cd /home/app/rule-service-api1/

sh /home/app/rule-service-api1/startup-rule.sh > /opt/restart9898_1.log 2>&1

sleep 10

echo 'kill and restart successful' >> /opt/restart9898_1.log

date >> /opt/restart9898_1.log

fi





遇到/etc/rc.local這個開機自啟動,但是在裡面寫命令確不執行怎麼辦


注意:

ll /etc/rc.local


[root@test ~]# ll /etc/rc.local 

lrwxrwxrwx. 1 root root 13 Oct 23  2014 /etc/rc.local -> rc.d/rc.local


發現這是一個連結檔案


[root@test ~]# ll /etc/rc.d/rc.local 

-rw-r--r-- 1 root root 696 Oct  8 11:16 /etc/rc.d/rc.local


在檢視發現許可權是644,並沒有執行許可權,原因就在這裡了

賦予許可權即可

chmod 755 /etc/rc.d/rc.local


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28371090/viewspace-2654131/,如需轉載,請註明出處,否則將追究法律責任。

相關文章