Я думаю, что у меня есть давно работающий скрипт mongo, убирающий мою базу данных, но я не уверен. Я был подключен к серверу linux через SSH, и я запустил сценарий следующим образом:
mongo my_database my_script.js
Он начал пыхтеть, но это длилось слишком долго, поэтому я ударил Ctrl-C
и упал обратно в оболочку. Я предполагал, что сценарий отключен, но теперь я вижу, что содержащиеся в нем запросы все еще выполняются в базе данных.
Как мне получить список скриптов, которые в настоящее время запущены в базе данных, и убить их? Я знаю о db.currentOp
и db.killOp
, но сами запросы выполняются быстро, мне нужно убить скрипт, выполняющий их в цикле.
Это может быть немного сложно, но тот факт, что оболочка MongoDB, по сути, является интерпретатором Javascript, дает нам неплохие возможности с точки зрения фильтрации. Вот функция, которую я использую для этого:
// kills long running ops in MongoDB (taking seconds as an arg to define "long")
// attempts to be a bit safer than killing all by excluding replication related operations
// and only targeting queries as opposed to commands etc.
killLongRunningOps = function(maxSecsRunning) {
currOp = db.currentOp();
for (oper in currOp.inprog) {
op = currOp.inprog[oper-0];
if (op.secs_running > maxSecsRunning && op.op == "query" && !op.ns.startsWith("local")) {
print("Killing opId: " + op.opid
+ " running over for secs: "
+ op.secs_running);
db.killOp(op.opid);
}
}
};
Это приведет к уничтожению только запросов, превышающих порог maxSecsRunning, и не затронет ничего, что работает с локальной базой данных, где находится журнал операций (и, следовательно, база данных, которая участвует в длительных операциях репликации. Относительно легко добавить критерии к внутренний if условный для более точного нацеливания операций по мере необходимости на основе конкретных потребностей.
Код также доступен в виде содержания (где я буду не забывать обновлять его на постоянной основе).
Это поможет вам нацелить определенные операции и прекратить их.