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