Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kill all R processes that hang for longer than a minute

Tags:

bash

r

kill

ubuntu

I use crontask to regularly run Rscript. Unfortunately, I need to do this on a small instance of aws and the process may hang, building more and more processes on top of each other until the whole system is lagging.

I would like to write a crontask to kill all R processes lasting longer than one minute. I found another answer on Stack Overflow that I've adapted that I think would solve the problem. I came up with;

if [[ "$(uname)" = "Linux" ]];then killall --older-than 1m "/usr/lib/R/bin/exec/R --slave --no-restore --file=/home/ubuntu/script.R";fi

I copied the task directly from htop, but it does not work as I expect. I get the No such file or directory error but I've checked it a few times.

I need to kill all R processes that have lasted longer than a minute. How can I do this?

like image 245
cylondude Avatar asked Jan 19 '16 22:01

cylondude


People also ask

How kill all processes running?

The easiest way to kill a bunch of processes altogether is through the killall command. The kill all command in Linux will first send a signal to every running daemon. If you do not specify any signal name, by default, it sends the SIGTERM.

How do you kill a hanged process?

Go to Home » System Health » Process Manager. Find the process ID for the hung process in the first column on the left. Click on the (Kill) link to the right of the process ID.

How use Pkill command in Linux?

The pkill command matches only process names by default. Through the -f option, we can instruct pkill to execute the completed command instead of the process name. Both will kill the ping commands running in your system by using the previous command. To avoid this problem, the -f command-line option is used.


2 Answers

You may want to avoid killing processes from another user and try SIGKILL (kill -9) after SIGTERM (kill -15). Here is a script you could execute every minute with a CRON job:

#!/bin/bash

PROCESS="R"
MAXTIME=`date -d '00:01:00' +'%s'`

function killpids()
{
    PIDS=`pgrep -u "${USER}" -x "${PROCESS}"`

    # Loop over all matching PIDs
    for pid in ${PIDS}; do
        # Retrieve duration of the process
        TIME=`ps -o time:1= -p "${pid}" |
              egrep -o "[0-9]{0,2}:?[0-9]{0,2}:[0-9]{2}$"`

        # Convert TIME to timestamp
        TTIME=`date -d "${TIME}" +'%s'`

        # Check if the process should be killed
        if [ "${TTIME}" -gt "${MAXTIME}" ]; then
            kill ${1} "${pid}"
        fi
    done
}

# Leave a chance to kill processes properly (SIGTERM)
killpids "-15"
sleep 5

# Now kill remaining processes (SIGKILL)
killpids "-9"
like image 158
jyvet Avatar answered Sep 28 '22 18:09

jyvet


Why imply an additional process every minute with cron? Would it not be easier to start R with timeout from coreutils, the processes will then be killed automatically after the time you chose.

timeout [option] duration command [arg]…
like image 24
user1747036 Avatar answered Sep 28 '22 18:09

user1747036