УБИТЬ процесс с вводом имени и времени процесса

Я знаю, что это было давно, но недавно перестроенный проект LFS по умолчанию несовместим с загрузкой виртуальной машины. LFS должен загружаться как хост на физической машине. Если кто-то может доказать, что я не прав, пожалуйста.

0
08.08.2019, 16:57
2 ответа

Вы можете получить время процессора в секундах вместе с pid и командой с помощью:

ps -Ao time= -o pid= -o comm= |
  perl -lpe 's/^(\d+-)?(\d\d):(\d\d):(\d\d)/(($1*24+$2)*60+$3)*60+$4/e'

Вы также можете убивать с помощью perl:

ps -Ao time= -o pid= -o comm= |
  perl -lne '
    if (/^(\d+-)?(\d\d):(\d\d):(\d\d)\s+(\d+)\s+(.*)/) {
      $cputime = (($1*24+$2)*60+$3)*60+$4;
      $pid = $5;
      $comm = $6;
      if ($cputime > 60) {
        print "$pid ($comm) has used $cputime seconds of CPU, killing it";
        kill "TERM", $pid or warn "kill($pid): $!\n";
      }
    }'
0
28.01.2020, 03:22

ИМХО, ты в кул -де -мешке и нет возможности делать что хочешь таким образом.

Проблема в том, что ваша TIMEинформация устарела, потому что, возможно, свойство TIMEэтих процессов изменилось во время работы скрипта. Пара TIME, CMDне может идентифицировать процесс.

Почему вы делаете awk '{print $7, $8}'? В этот момент вам не нужен CMD, вам нужен только PIDдля идентификации процесса, поэтому просто измените его на awk '{print $7, $2}'.

Вы можете изменить свой код следующим образом, чтобы вывести PIDпроцессов, которые вы ищете:

ps -eaf \
| awk '{print $7, $2}' \
| sort -n \
| grep -v TIME \
| grep -v 00:00:00 \
| awk -F ":" '{if ( $2 >= 01 ) print}' \
| awk '{print $2}'

Кроме того, в вашем коде есть небольшая ошибка :, что произойдет, если процесс имеет 04:00:23как TIME? Ваш код пропустит его, потому что проверяет только поле минут в TIME. Вы можете исправить это так:

ps -eaf \
| awk '{print $7, $2}' \
| sort -n \
| grep -v TIME \
| grep -v 00:00:00 \
| awk -F ":" '{if (( $1 >= 01 ) || ( $2 >= 01 )) print}' \
| awk '{print $2}'

Несколько советов по улучшению ваших навыков:

  • Вы должны проверить опцию -oв psи опцию -Fв awkи, возможно, значение столбца TIMEв ps.
  • Попробуйте понять, как работает следующая строка:

    ps -eo time,pid --no-headers | awk -F '[ :]*' '$1>0 || $2>0 {print $4}' | xargs kill
    
0
28.01.2020, 03:22

Теги

Похожие вопросы