1. 程式人生 > >linux中定時任務執行失敗

linux中定時任務執行失敗

問題來源:

最近發現數據庫中有sleep程序無法關閉,並且阻塞時間過長,需要執行指令碼,定時清除

解決方案:

原指令碼檔案:

#!/bin/sh

MYSQLTOOL=mysql

MYSQLUSER=root

MYSQLPASS=****

HOST=*****

PORT=3306

sleepid="SELECT ID FROM information_schema.PROCESSLIST t WHERE t.COMMAND='Sleep' and time >1200;"

$MYSQLTOOL -h$HOST -u$MYSQLUSER -p$MYSQLPASS -P$PORT -e "$sleepid" >sleepIDs

while read sID

do

if [ ${sID} != 'ID' ];then

echo ${sID}

$MYSQLTOOL -h$HOST -u$MYSQLUSER -p$MYSQLPASS -P$PORT -e "kill ${sID}"

fi

done<sleepIDs

定時任務(每個小時的第一分鐘執行):

1 * * * * sh /app/mysql/clean_process/cleanmysql.sh

經過觀察,發現指令碼檔案雖然執行,但是沒有生效

修改定時任務執行,將允許過程記錄下來

1 * * * * sh /app/mysql/clean_process/cleanmysql.sh >> /app/softlog/cron.log 2>&1

進入該目錄下檢視,發現報錯

/app/mysql/clean_process/cleanmysql.sh: line 9: mysql: command not found

檢視指令碼,發現是因為執行mysql命令時失敗了,mysql -h...這個命令無法識別

在命令列中直接執行mysql可以跳轉到資料庫,並且執行指令碼成功,推測可能是在定時任務執行指令碼時,無法直接使用mysql命令,需要帶上mysql的全路徑

在命令列中使用which mysql 查詢mysql全路徑,並替換到指令碼中,任務成功執行

修改後指令碼:

#!/bin/sh

MYSQLTOOL=/alidata/server/mysql/bin/mysql

MYSQLUSER=root

MYSQLPASS=****

HOST=*****

PORT=3306

sleepid="SELECT ID FROM information_schema.PROCESSLIST t WHERE t.COMMAND='Sleep' and time >1200;"

$MYSQLTOOL -h$HOST -u$MYSQLUSER -p$MYSQLPASS -P$PORT -e "$sleepid" >sleepIDs

while read sID

do

if [ ${sID} != 'ID' ];then

echo ${sID}

$MYSQLTOOL -h$HOST -u$MYSQLUSER -p$MYSQLPASS -P$PORT -e "kill ${sID}"

fi

done<sleepIDs