我想我有一个长时间运行的芒果脚本在我的数据库,但我不确定。我通过SSH连接到linux服务器,运行脚本如下:
mongo my_database my_script.js它开始嗡嗡作响,但花了太长时间,所以我击中了Ctrl-C,然后掉回了壳里。我以为脚本已经被删除了,但现在我看到的是它包含的查询仍然在数据库上运行。
如何获得数据库当前正在运行的脚本列表并杀死它们?我知道db.currentOp和db.killOp,但是实际的查询本身是快速的,我需要杀死循环中运行它们的脚本。
发布于 2016-06-17 13:04:01
这可能有点棘手,但实际上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阈值的查询,并且不会触及任何针对本地数据库运行的查询,本地数据库就是oplog所在的地方(因此也就是长期运行的复制操作所涉及的数据库)。如果有条件地根据特定需求向内部添加更精确的目标操作,那么向内部添加标准是相对容易的。
代码也可作为gist (我将记得不断更新它)。
这将帮助您针对特定的操作并终止相同的操作。
https://serverfault.com/questions/585170
复制相似问题