Как убить все процессы Linux старше определенного возраста?

У меня проблема с некоторыми зомби-подобными 9X_unix-utils процессами на определенном сервере, которые 9X_.bash-profile нужно время от времени убивать. Как я могу 9X_bashrc лучше всего идентифицировать те, которые 9X_.bash-profile работают дольше часа или около того?

69
1

  • В Linux используйте `killall -i --older-than 1h somepro ...
10
Общее количество ответов: 10

Ответ #1

Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?

Нашел ответ, который работает для меня:

предупреждение: это найдет и убьет долго работающие процессы

ps -eo uid,pid,etime | egrep '^ *user-id' | egrep ' ([0-9]+-)?([0-9]{2}:?){3}' | awk '{print $2}' | xargs -I{} kill {} 

(Где 9X_bash-variables user-id — идентификатор конкретного пользователя 9X_unix-utils с длительными процессами.)

Второе регулярное 9X_.bashrc выражение соответствует времени a, которое 9X_bash-function может иметь необязательную цифру дней, за 9X_bash-alias которой следуют час, минута и второй компонент, поэтому 9X_unix-utils его длина составляет не менее одного часа.

36
4

  • Умм, ты убиваешь процесс? Я надеюсь, что люди поймут, что этот код не просто находит, но и убивает, иначе они могут расстроить ...

Ответ #2

Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?

Если их просто нужно убить:

if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h someprocessname;fi 

Если вы хотите 9X_bash-variables увидеть, что соответствует

if [[ "$(uname)" = "Linux" ]];then killall -i --older-than 1h someprocessname;fi 

Флаг -i будет запрашивать 9X_.bashrc да / нет для каждого совпадения процесса.

34
3

  • @ringo Потому что в некоторых системах (например, Solaris) killall - это совершенно другая ко ...

Ответ #3

Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?

Для всего, что старше одного дня,

ps aux 

даст вам 9X_processes ответ, но с точностью до дня, что может 9X_unix-utils быть не так полезно.

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 7200 308 ? Ss Jun22 0:02 init [5] root 2 0.0 0.0 0 0 ? S Jun22 0:02 [migration/0] root 3 0.0 0.0 0 0 ? SN Jun22 0:18 [ksoftirqd/0] root 4 0.0 0.0 0 0 ? S Jun22 0:00 [watchdog/0] 

Если вы используете 9X_process Linux или другую систему с файловой системой 9X_bashrc /proc, в этом примере вы можете видеть только 9X_bash-alias то, что процесс 1 запущен с 22 июня, но 9X_processes без указания времени, когда он был запущен.

stat /proc/ 

даст 9X_bash вам более точный ответ. Например, вот точная 9X_bash-script метка времени для процесса 1, который ps 9X_bash показывает только как Jun22:

ohm ~$ stat /proc/1 File: `/proc/1' Size: 0 Blocks: 0 IO Block: 4096 directory Device: 3h/3d Inode: 65538 Links: 5 Access: (0555/dr-xr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2008-06-22 15:37:44.347627750 -0700 Modify: 2008-06-22 15:37:44.347627750 -0700 Change: 2008-06-22 15:37:44.347627750 -0700 

22
2

  • Обратите внимание, что столбец TIME в выводе ps не показывает фактическое время выполнения процесса. Он по ...

Ответ #4

Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?

Таким образом вы можете получить список 9X_bash-alias десяти самых старых процессов:

ps -elf | sort -r -k12 | head -n 10

9
0

Ответ #5

Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?

Джоди Си и другие указали, что можно использовать 9X_process killall -i, и это нормально, если вы хотите использовать 9X_unix-utils имя процесса для уничтожения. Но если вы 9X_.bashrc хотите убить с теми же параметрами, что 9X_unix-programming и pgrep -f, вам нужно использовать что-то вроде 9X_processes следующего, используя чистый bash и файловую 9X_bash-alias систему /proc.

#!/bin/sh max_age=120 # (seconds) naughty="$(pgrep -f offlineimap)" if [[ -n "$naughty" ]]; then # naughty is running age_in_seconds=$(echo "$(date +%s) - $(stat -c %X /proc/$naughty)" | bc) if [[ "$age_in_seconds" -ge "$max_age" ]]; then # naughty is too old! kill -s 9 "$naughty" fi fi 

Это позволяет находить и уничтожать 9X_linux процессы старше max_age секунд, используя полное имя процесса; т.е. процесс 9X_unix с именем /usr/bin/python2 offlineimap может быть остановлен ссылкой 9X_.bashrc на «offlineimap», тогда как решения killall, представленные 9X_bash-script здесь, будут работать только со строкой 9X_bash-alias «python2».

8
0

Ответ #6

Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?

Perl Proc :: ProcessTable сделает свое дело: http://search.cpan.org/dist/Proc-ProcessTable/

Вы 9X_bash-function можете установить его в debian или ubuntu 9X_linux с помощью sudo apt-get install libproc-processtable-perl

Вот однострочный текст:

perl -MProc::ProcessTable -Mstrict -w -e 'my $anHourAgo = time-60*60; my $t = new Proc::ProcessTable;foreach my $p ( @{$t->table} ) { if ($p->start() < $anHourAgo) { print $p->pid, "\n" } }' 

Или, в 9X_.bash-profile более точном формате, поместите это в файл 9X_processes с именем process.pl:

#!/usr/bin/perl -w use strict; use Proc::ProcessTable; my $anHourAgo = time-60*60; my $t = new Proc::ProcessTable; foreach my $p ( @{$t->table} ) { if ($p->start() < $anHourAgo) { print $p->pid, "\n"; } } 

затем запустите perl process.pl

Это 9X_bash-script дает вам больше универсальности и дает 1-секундное 9X_.bashrc разрешение при запуске.

7
0

Ответ #7

Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?

Вы можете использовать bc, чтобы объединить 9X_bash-function две команды в ответе моба и узнать, сколько 9X_bash-variables секунд прошло с момента запуска процесса:

echo `date +%s` - `stat -t /proc/ | awk '{print $14}'` | bc 

редактировать:

От 9X_bash-function скуки в ожидании запуска долгих процессов, вот 9X_bashrc что получилось после нескольких минут возни:

#file: sincetime #!/bin/bash init=`stat -t /proc/$1 | awk '{print $14}'` curr=`date +%s` seconds=`echo $curr - $init| bc` name=`cat /proc/$1/cmdline` echo $name $seconds 

Если 9X_processes вы поместите это на свой путь и назовете 9X_process это так: с тех пор

он напечатает командную 9X_.bashrc строку процесса и секунды с момента запуска. Вы 9X_.bash-profile также можете указать это на своем пути:

#file: greptime #!/bin/bash pidlist=`ps ax | grep -i -E $1 | grep -v grep | awk '{print $1}' | grep -v PID | xargs echo` for pid in $pidlist; do sincetime $pid done 

А 9X_unix чем если бы вы бежали:

greptime 

, где шаблон - это 9X_unix-programming строка или расширенное регулярное выражение, он 9X_unix-utils распечатает все процессы, соответствующие 9X_linux этому шаблону, и секунды с момента их запуска. :)

3
0

Ответ #8

Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?

сделайте ps -aef. это покажет вам время, когда 9X_bashrc процесс начался. Затем с помощью команды 9X_.bash-profile date найдите текущее время. Вычислите разницу 9X_bash-function между ними, чтобы определить возраст процесса.

2
0

Ответ #9

Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?

Я сделал что-то похожее на принятый ответ, но 9X_linux немного по-другому, так как я хочу сопоставить 9X_process на основе имени процесса и на основе неправильного 9X_unix-programming процесса, выполняющегося более 100 секунд

kill $(ps -o pid,bsdtime -p $(pgrep bad_process) | awk '{ if ($RN > 1 && $2 > 100) { print $1; }}') 

1
0

Ответ #10

Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?

stat -t /proc/ | awk '{print $14}'

, чтобы получить время начала процесса в 9X_bashrc секундах с начала эпохи. Сравните с текущим 9X_bash-script временем (date +%s), чтобы узнать текущий возраст 9X_linux процесса.

1
1

  • Это не всегда будет правильным - по крайней мере, не для систем Linux 2.6. У меня есть проц ...