Мне нужна команда для уничтожения процессов, запущенных не менее 5 минут для данного процесса.
Мне придется запускать эту команду каждые пять минут или около того.
Бесконечно благодарен !
(система - Centos5)
kill -9 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print $2}}')
где "procname" - это имя процесса, а 300 - порог времени выполнения
Может быть, запустить такую длинную команду в crontab?
timeout -k 300 command
Моя версия сценария уничтожения, использующая оба предыдущих ответа:
#!/bin/bash
#Email to send report
MY_EMAIL="example@email.com"
#Process name to kill
NAME_KILL="php"
#UID to kill
UID_KILL=33.
#Time in seconds which the process is allowed to run
KILL_TIME=60
KILL_LIST=()
EMAIL_LIST=()
while read PROC_UID PROC_PID PROC_ETIMES PROC_ETIME PROC_COMM PROC_ARGS; do
if [ $PROC_UID -eq $UID_KILL -a "$PROC_COMM" == "$NAME_KILL" -a $PROC_ETIMES -gt $KILL_TIME ]; then
KILL_LIST+=("$PROC_PID");
MSG="Killing '$PROC_ARGS' which runs for $PROC_ETIME";
EMAIL_LIST+=("$MSG");
echo "$MSG";
fi
done < <(ps eaxo uid,pid,etimes,etime,comm,args | tail -n+2)
if [ ${#KILL_LIST[*]} -gt 0 ]; then
kill -9 ${KILL_LIST[@]}
printf '%s\n' "${EMAIL_LIST[@]}" | mail -s "Long running processes killed" $MY_EMAIL
fi
Он фильтрует процесс по UID, NAME и, если время выполнения превышает лимит - убивает процессы и отправляет отчет на электронную почту. Если вам не нужно это письмо - вы можете просто прокомментировать последнюю строку.
Я нашел решение на этой странице: http://www.directadmin.com/forum/showthread.php?t=26179
Создайте пустой файл и назовите его killlongproc.sh
#!/bin/bash
# This script will kill process which running more than X hours
# egrep: the selected process; grep: hours
PIDS="`ps eaxo bsdtime,pid,comm | egrep "spamd|exim|mysqld|httpd" | grep " 1:" | awk '{print $2}'`"
# Kill the process
echo "Killing spamd, exim, mysqld and httpd processes running more than one hour..."
for i in ${PIDS}; do { echo "Killing $i"; kill -9 $i; }; done;
Остановите это в своем cronjob
15 * * * * * root /{directory}/./killongproc.sh
Есть сценарий Вот что вы можете изменить, чтобы делать то, что хотите.
EDIT добавил скрипт ниже
#!/bin/bash
#
#Put the UID to kill on the next line
UID_KILL=1001
#Put the time in seconds which the process is allowed to run below
KILL_TIME=300
KILL_LIST=`{
ps -eo uid,pid,lstart | tail -n+2 |
while read PROC_UID PROC_PID PROC_LSTART; do
SECONDS=$[$(date +%s) - $(date -d"$PROC_LSTART" +%s)]
if [ $PROC_UID -eq $UID_KILL -a $SECONDS -gt $KILL_TIME ]; then
echo -n "$PROC_PID "
fi
done
}`
if [[ -n $KILL_LIST ]]
then
kill $KILL_LIST
fi
Мне пришлось решать аналогичную задачу, и для этого не нужен скрипт. Для завершения (сигнал SIGTERM) процессов исполняемого «THECOMMAND»:
killall -u $USER --older-than 5m THECOMMAND
Ограничение для текущего пользователя -u $USER
необходимо только во избежание ненужных сообщений об ошибках, если другие пользователи также запускают «THECOMMAND». В вашем собственном пользовательском crontab вы должны ввести следующее:
*/5 * * * * killall -u $USER --older-than 5m THECOMMAND
В системный crontab (пользователь root) вы должны добавить следующее:
*/5 * * * * killall --older-than 5m THECOMMAND
Если вы хотите убить (SIGKILL) процессы вместо их завершения (SIGTERM), явно отправьте сигнал SIGKILL, добавив --signal SIGKILL
к параметрам. Пример для системного crontab:
*/5 * * * * killall --older-than 5m --signal SIGKILL THECOMMAND
Для httpd
ps eaxo pid, time, comm | хвост -n + 2 | grep 'httpd' | awk 'substr ($ 0,9,1)> 0' | awk '{print $ 1}'