A sample to automatically cleanup tasks executed too long

Here is a sample code to cleanup MongoDB tasks.

#!/usr/bin/env bash

function do_cleanup() {
mongo 127.0.0.1:27017/admin \
--username 'my-username' \
--password 'my-password' --eval '
db.currentOp().inprog.forEach(
function(op) {
if(op.secs_running > 10 &&
op.client != null &&
op.client.startsWith("127.0.0.1:") ) {
db.killOp(op.opid)
}
}
)
'
}

while sleep 8
do
echo "do cleanup"$(date)
do_cleanup
done;

What Am I Doing Here?

I will run “do_cleanup” every 8 seconds

I will login to 127.0.0.1:27017, check my current operation

I will filter each operation, kill the operations request from 127.0.0.1 and run more than 10 seconds

What Does The “db.currentOp()” Seems Like?

local:PRIMARY> db.currentOp()
{
"inprog" : [
{
"desc" : "conn1379280",
"threadId" : "139962306003704",
"connectionId" : 1379280,
"client" : "127.0.0.1:12345",
"active" : true,
"opid" : 1070507339,
"secs_running" : 0,
"microsecs_running" : NumberLong(11),
"op" : "command",
"ns" : "admin.$cmd",
"query" : {
"currentOp" : 1
},
"numYields" : 0,
"locks" : {

},
"waitingForLock" : false,
"lockStats" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(20),
"w" : NumberLong(3),
"R" : NumberLong(1),
"W" : NumberLong(2)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(7),
"w" : NumberLong(2),
"W" : NumberLong(1)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(6)
}
},
"Metadata" : {
"acquireCount" : {
"w" : NumberLong(1)
}
},
"oplog" : {
"acquireCount" : {
"r" : NumberLong(1),
"w" : NumberLong(2)
}
}
}
}
]
}

We just need to read secs_running in each object listed in inprog, and kill them by id, which is appeared as opid in each object.