回答:
これは少し難しいかもしれませんが、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
しきい値を超えるクエリのみが強制終了され、稼働中のデータベース(つまり、長時間実行されるレプリケーション操作に関与するlocal
データベース)に対して実行されているものには触れませんoplog
。内部のif
条件に条件を追加するのは比較的簡単です。特定のニーズに基づいて、必要に応じて操作をより正確にターゲットにする。
コードは要旨としても利用できます(継続的に更新することを覚えておきます)。
db.currentOp()
シャードされたデータベースで実行すると、 ""ネームスペース(別名ns: "")で、 "repl writer worker n"(nは整数)のdescで非常に長時間実行される操作が返されます。強制終了したいクエリを使用して、実際のデータベースの名前空間をホワイトリストに登録することをお勧めします。状態の&& (['users', 'analytics'].indexOf(op.ns) != -1)
代わりのようなもの!op.ns.startsWith
。