Как вы убиваете все процессы Linux, которые старше определенного возраста? - PullRequest
65 голосов
/ 08 августа 2008

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

Ответы [ 14 ]

0 голосов
/ 26 августа 2018

Моя версия sincetime выше @Rafael S. Calsaverini:

#!/bin/bash
ps --no-headers -o etimes,args "$1"

Это инвертирует поля вывода: сначала истекшее время, полная команда, включая аргументы. Это предпочтительно, потому что полная команда может содержать пробелы.

0 голосов
/ 06 июля 2014

наткнулся где-то .. думал, что это просто и полезно

Вы можете использовать команду в crontab напрямую,

* * * * * ps -lf | grep "user" |  perl -ane '($h,$m,$s) = split /:/,$F
+[13]; kill 9, $F[3] if ($h > 1);'

или, мы можем написать это как скрипт оболочки,

#!/bin/sh
# longprockill.sh
ps -lf | grep "user" |  perl -ane '($h,$m,$s) = split /:/,$F[13]; kill
+ 9, $F[3] if ($h > 1);'

И назовите это crontab следующим образом,

* * * * * longprockill.sh
0 голосов
/ 02 апреля 2012

Если кому-то это нужно в C, вы можете использовать readproc.h и libproc:

#include <proc/readproc.h>
#include <proc/sysinfo.h>

float
pid_age(pid_t pid)
{
        proc_t proc_info;
        int seconds_since_boot = uptime(0,0);
        if (!get_proc_stats(pid, &proc_info)) {
                return 0.0;
        }

        // readproc.h comment lies about what proc_t.start_time is. It's
        // actually expressed in Hertz ticks since boot

        int  seconds_since_1970 = time(NULL);
        int time_of_boot = seconds_since_1970 - seconds_since_boot;
        long  t = seconds_since_boot - (unsigned long)(proc_info.start_time / Hertz);

        int delta = t;
        float days = ((float) delta / (float)(60*60*24));
        return days;
}
0 голосов
/ 08 августа 2008

Использование PS это правильный путь. Я уже делал нечто подобное раньше, но у меня нет источника под рукой. Обычно - ps может указать, какие поля показывать и по каким сортировать. Вы можете отсортировать вывод по времени выполнения, выполнить требуемый процесс grep и затем убить его.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...