Для наблюдения, какие потоки работают в mysql из Linux:
root@myserver:~> mysqladmin processlist
Эквивалентный запрос mysql к этому был бы:
root@myserver:~> mysql
mysql> SHOW FULL PROCESSLIST\G
Кроме того, выезд, Исследующий информацию о Потоке для наблюдения то, что означает вывод. Прежде всего:
Команда и состояние указывают на то, что делает поток.
Большинство состояний соответствует очень быстрым операциям. Если поток остается в данном состоянии в течение многих секунд, могла бы быть проблема, которая должна быть исследована.
Основной момент должен посмотреть на mysql список процессов и видеть, выглядит ли что-нибудь подозрительным Вам, учитывая природу Вашей среды, например, продолжительные процессы или большой # процессов.
Вы могли сделать что-то как:
fixhist() {
local cmd histnum
cmd=$(HISTTIMEFORMAT=/ history 1)
histnum=$((${cmd%%[*/]*}))
cmd=${cmd#*/} # remove the histnum
case $cmd in
(rm\ *|mv\ *|...)
history -d "$histnum" # delete
history -s "#$cmd" # add back with a #
esac
}
PROMPT_COMMAND=fixhist
Причем идея состоит в том, что перед каждой подсказкой, мы проверяем последнюю запись истории (history 1
) и если это - один из опасных, мы удаляем его (history -d
) и добавьте его назад с a #
с history -s
.
(очевидно, необходимо удалить Ваш HISTIGNORE
установка).
Нежелательный побочный эффект что, хотя то, что он изменяет время истории тех rm
, mv
... команды.
Для фиксации этого альтернатива могла быть:
fixhist() {
local cmd time histnum
cmd=$(HISTTIMEFORMAT='<%s>' history 1)
histnum=$((${cmd%%[<*]*}))
time=${cmd%%>*}
time=${time#*<}
cmd=${cmd#*>}
case $cmd in
(rm\ *|mv\ *|...)
history -d "$histnum" # delete
HISTFILE=/dev/stdin history -r <<EOF
#$time
#$cmd
EOF
esac
}
PROMPT_COMMAND=fixhist
На этот раз мы записываем время последней истории, и добавить назад строку истории, мы используем history -r
из временного файла (здесь документ), который включает метку времени.
Вы хотели бы fixhist
быть выполненным перед Вашим history -a; history -c; history -r
. К сожалению, текущая версия bash
имеет ошибку в этом history -a
не сохраняет ту дополнительную строку, которую мы добавили. Работа вокруг должна записать это вместо этого:
fixhist() {
local cmd time histnum
cmd=$(HISTTIMEFORMAT='<%s>' history 1)
histnum=$((${cmd%%[<*]*}))
time=${cmd%%>*}
time=${time#*<}
cmd=${cmd#*>}
case $cmd in
(rm\ *|mv\ *|...)
history -d "$histnum" # delete
history -a
[ -f "$HISTFILE" ] && printf '#%s\n' "$time" "$cmd" >> "$HISTFILE";;
(*)
history -a
esac
history -c
history -r
}
PROMPT_COMMAND=fixhist
Это должно добавить прокомментированную команду к HISTFILE самостоятельно вместо разрешения history -a
сделайте это.
Я не собираюсь точно отвечать на Ваш вопрос, но возможно давать Вам альтернативное решение Вашей проблемы.
Если я понимаю правильно, что Вы обеспокоены ошибками, Вы могли бы сделать путем ввода, например, !rm
если это произошло что предыдущее rm
команда в истории удаляет что-то, что требуется сохранить.
В этом случае хорошая опция удара histverify
. Если Вы shopt -s histverify
, и если Вы повторно вызываете команду с ударом !
, это сразу не выполнится, но будет загружено в readline так, чтобы можно было или решить выполнить его или нет, и это также дает Вам возможность отредактировать его.
Попробуйте:
Без histverify
:
$ touch some_foo
$ rm some_foo
$ touch some_foo
$ !rm
rm some_foo
$ # oooops in fact I'd've like to keep it this time
С histverify
:
$ shopt -s histverify
$ touch some_foo
$ rm some_foo
$ touch some_foo
$ !rm
$ rm some_foo <cursor here>
В этом случае у Вас будет курсор в конце строки, готовой запустить его снова - или не - или отредактировать его.
Если Вы любите эту опцию, вставляете ее Ваш .bashrc
:
shopt -s histverify
cmd=${cmd#*[0-9] }
? И где точно должен я помещатьfixhist
в моемPROMPT_COMMAND
? В данный момент это уже содержитPROMPT_COMMAND="history -a; history -c; history -r"
– Martin Vegter 19.01.2014, 23:47HISTTIMEFORMAT=/
? Я уже установилexport HISTTIMEFORMAT="%b-%d %H:%M "
. Между прочим, когда я добавляю Ваш код в мой$HOME/.bashrc
, ничего не происходит. – Martin Vegter 20.01.2014, 00:27HISTTIMEFORMAT=/
только для того одного вызоваhistory
получить вывод как123 /rm x
где легче извлечь cmd. Была проблема с некоторыми версиямиbash
где$HISTCMD
было поддельным в том контексте, попробуйте новую версию. – Stéphane Chazelas 20.01.2014, 00:38#
в коде не действуют как комментарии в.bashrc
? – Martin Vegter 20.01.2014, 13:59bash
вставляет a*
после числа истории, которое не ожидалось. Должен быть зафиксирован теперь. – Stéphane Chazelas 18.04.2014, 16:41