Убить все процессы, которые висят дольше, чем на минуту
Я использую 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
на