Как убить все процессы Linux старше определенного возраста?
У меня проблема с некоторыми зомби-подобными 9X_unix-utils процессами на определенном сервере, которые 9X_.bash-profile нужно время от времени убивать. Как я могу 9X_bashrc лучше всего идентифицировать те, которые 9X_.bash-profile работают дольше часа или около того?
- В Linux используйте `killall -i --older-than 1h somepro ...
Ответ #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 его длина составляет не менее одного часа.
- Умм, ты убиваешь процесс? Я надеюсь, что люди поймут, что этот код не просто находит, но и убивает, иначе они могут расстроить ...
Ответ #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 да / нет для каждого совпадения процесса.
- @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
- Обратите внимание, что столбец TIME в выводе ps не показывает фактическое время выполнения процесса. Он по ...
Ответ #4
Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?
Таким образом вы можете получить список 9X_bash-alias десяти самых старых процессов:
ps -elf | sort -r -k12 | head -n 10
Ответ #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».
Ответ #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
Ответ на вопрос: Как убить все процессы 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 этому шаблону, и секунды с момента их запуска. :)
Ответ #8
Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?
сделайте ps -aef
. это покажет вам время, когда 9X_bashrc процесс начался. Затем с помощью команды 9X_.bash-profile date
найдите текущее время. Вычислите разницу 9X_bash-function между ними, чтобы определить возраст процесса.
Ответ #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; }}')
Ответ #10
Ответ на вопрос: Как убить все процессы Linux старше определенного возраста?
stat -t /proc/
, чтобы получить время начала процесса в 9X_bashrc секундах с начала эпохи. Сравните с текущим 9X_bash-script временем (date +%s
), чтобы узнать текущий возраст 9X_linux процесса.
- Это не всегда будет правильным - по крайней мере, не для систем Linux 2.6. У меня есть проц ...
-
9
-
2
-
7
-
3
-
1
-
3
-
8
-
18
-
10
-
12
-
4
-
6
-
2
-
8
-
1
-
1
-
12
-
5
-
7
-
5
-
3
-
2
-
3
-
2
-
1
-
7
-
7
-
3
-
2
-
5
-
1
-
1
-
4
-
3
-
2
-
30
-
31
-
13
-
7
-
9
-
6
-
4
-
3
-
3
-
5
-
5
-
7
-
3
-
6
-
1