Bash mysql обработка ошибок заблокированных таблиц

у меня есть сценарий оболочки, который вызывается с несколькими параметрами очень часто. предполагается построить запрос и выполнить инструкцию. в случае возникновения ошибки, он должен записать аргументы, разделенные в файл, чтобы обработка ошибок могла произойти путем вызова этого сценария снова.

все работает, но

проблема в том, что я ловлю соединение отказано ошибка и т.д., Но если оператор не может быть выполнен, потому что таблица заблокирована, и я не хочу ждать тайм-аута.

мой код:

...
mysql -u ${username} -p${password} -h ${database} -P ${port} --connect-timeout=1 --skip-reconnect -e "$NQUERY"
    mysqlstatus=$?
    if [ $mysqlstatus -ne 0 ]; then
        echo "[ERROR:QUERY COULD NOT BE EXECUTED:$mysqlstatus: QUERY WRITTEN TO LOG]" >> ${GENLOG} 
        #echo ${NQUERY} >> ${FQUER} 
        for i in "$@"; do
            ARGS="$ARGS $i|"
        done
        echo "${ARGS}" >> ${ARGLOG}
    else
        echo "[OK] $NQUERY" >> ${GENLOG}
    fi
...

но когда таблица заблокирована, выполнение не отменяется и выполняется как forever..

its not a solution for me to set the Max_statement_time_set or anything on the mysql server, since im not the only one using the db

1 ответ

  1. Вы можете использовать команду timeout вместе с mysql

    timeout 3 mysql -u ...
    

    Это будет ждать 3 секунды для команды mysql, чтобы вернуться, если команда работает дольше, то 3 секунды timeout вернет статус выхода 124 в оболочку. Если у вас нет таймаута, вы можете использовать управление заданиями с чем-то вроде этого.

    #background the process
    mysql -u ... &
    
    #get pid of background process
    bg_pid=$!
    
    sleep 3
    
    #check if your pid is still running
    #using string matching incase pid was re assigned
    if [[ $(ps -p $bg_pid -o args --no-headers) =~ "mysql" ]]
    then
        echo "running to long"
    else
        echo "OK"
    fi