Убить все процессы, которые висят дольше, чем на минуту

Я использую crontask для регулярного запуска Rscript. К сожалению, мне нужно сделать это на небольшом экземпляре aws, и процесс может зависнуть, создавая все больше и больше процессов друг над другом, пока вся система не отстает.

Я хотел бы написать crontask, чтобы убить все R-процессы, длящиеся дольше одной минуты. я нашел другой ответ на переполнение стека, который я адаптировал, что, я думаю, решит проблему. Я придумал;

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

I скопировал задачу непосредственно из htop, но она не работает, как я ожидаю. Я получаю No such file or directory ошибка, но я проверил ее несколько раз.

мне нужно убить все процессы, которые длились больше минуты. Как я могу это сделать?

3 ответов


вы можете избежать убийства процессов от другого пользователя и попробовать сигнал SIGKILL (kill -9) после команды SIGTERM (kill -15). Вот сценарий, который вы можете выполнять каждую минуту с помощью 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  "${pid}"
        fi
    done
}

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

# Now kill remaining processes (SIGKILL)
killpids "-9"

почему подразумевается дополнительный процесс каждую минуту с cron? Не проще ли начать R с тайм-аут от coreutils, процессы будут убиты автоматически после того, как вы выбрали время.

timeout [option] duration command [arg]…

Я думаю, что лучший вариант всего . Я не эксперт, но кажется future пакет позволит выполнять функцию в отдельном thread. Вы можете запустить фактическую задачу в отдельном потоке, а в основном потоке спать в течение 60 секунд, а затем stop().


Предыдущие Обновления user1747036 это ответ, который рекомендует timeout является лучшей альтернативой.


мой оригинальный ответ

этот вопрос больше подходит для суперпользователя, но вот несколько вещей неправильно с

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