慢查询crontab shell脚本

时间:2016-03-06 21:42:35

标签: shell

我的查询shell脚本速度慢,如下所示:

scp kill_slow_queries.sh root@$db:/root/
ssh -t -t -o StrictHostKeyChecking=no root@$db "grep -q -F '#Chef Name: kill_slow_queries' /var/spool/cron/crontabs/root || echo '#Chef Name: kill_slow_queries' >> /var/spool/cron/crontabs/root"
ssh -t -t -o StrictHostKeyChecking=no root@$db "grep -q -F '* * * * * cd /root && sh kill_slow_queries.sh >> killed_queries.log' /var/spool/cron/crontabs/root || echo ' * * * * * cd /root && sh kill_slow_queries.sh >> killed_queries.log' >> /var/spool/cron/crontabs/root"
ssh -t -t -o StrictHostKeyChecking=no root@$db "grep -q -F '* * * * * ( sleep 15 ; cd /root && sh kill_slow_queries.sh >> killed_queries.log )' /var/spool/cron/crontabs/root || echo ' * * * * * ( sleep 15 ; cd /root && sh kill_slow_queries.sh >> killed_queries.log )' >> /var/spool/cron/crontabs/root"
ssh -t -t -o StrictHostKeyChecking=no root@$db "grep -q -F '* * * * * ( sleep 30 ; cd /root && sh kill_slow_queries.sh >> killed_queries.log )' /var/spool/cron/crontabs/root || echo ' * * * * * ( sleep 30 ; cd /root && sh kill_slow_queries.sh >> killed_queries.log )' >> /var/spool/cron/crontabs/root"
ssh -t -t -o StrictHostKeyChecking=no root@$db "grep -q -F '* * * * * ( sleep 45 ; cd /root && sh kill_slow_queries.sh >> killed_queries.log )' /var/spool/cron/crontabs/root || echo ' * * * * * ( sleep 45 ; cd /root && sh kill_slow_queries.sh >> killed_queries.log )' >> /var/spool/cron/crontabs/root"

对于上面的shell脚本,查询将每隔15分钟运行一次。但我需要帮助,

如果在2.15PM中运行slow_query来查杀。但是这个任务再次运行2.30PM再次任务开始杀死slow_query任务而没有完成第一个任务。

如果第一个任务开始运行并完成任务,我需要帮助。我们想再次开始第二项任务。如果没有完成第一个任务,则不会再开始第二个时间间隔。

如果他们有任何方法。请告诉我....

1 个答案:

答案 0 :(得分:0)

我的解决方案避免使用crontab。它创建了一个shell守护进程。

daemon.sh:

#!/bin/ksh
#every 15 min
_DELAY=900

rm -f "${_FICSTOP}" 2>&1
if [ ${?} -ne 0 ]
then
 echo "$(date +%Y%m%d-%H%M%S) FATAL : unable to delete stop file."
 return 1
fi

## star main loop
echo "$(date +%Y%m%d-%H%M%S) : star daemon OK."

while [ 1 ]
do
  if [ -f "${_FICSTOP}" ]
  then
    echo "$(date +%Y%m%d-%H%M%S) : stop file found; stopping daemon..."
    break
  fi

  #do what you need
  sleep 15 ; cd /root && sh kill_slow_queries.sh >> killed_queries.log 
  sleep 15 ; cd /root && sh kill_slow_queries.sh >> killed_queries.log 
  sleep 15 ; cd /root && sh kill_slow_queries.sh >> killed_queries.log 

  echo "  $(date +%Y%m%d-%H%M%S) : sleeping for ${_DELAY} seconds..."
  sleep ${_DELAY}

done

return 0

然后调用它:

export _FICSTOP=/root/stop.file ; nohup sh daemon.sh  &

然后停止守护进程,你做了

touch /root/stop.file