1

Я выдаю команду ps -aux | grep tony . Отображает следующий вывод

tony    10986  0.0  0.0  33532   464 ?        S    Feb01   0:00 vncconfig -iconic
tony    10988  0.0  0.0  86012   512 ?        S    Feb01   0:00 twm
tony    15553  0.0  0.0  92404  1848 ?        S    10:34   0:00 sshd: tony@pts/34
tony    15554  0.0  0.0  66232  1680 pts/34   Ss+  10:34   0:00 -bash

Я хотел бы убить все мои мертвые процессы, даты которых старше, чем сегодня.

Я мог бы выполнить команду kill -9 10986 ; kill -9 10988 , но мне нравится выполнять одну команду, а также есть много незавершенных процессов.

Любая помощь приветствуется.

4 ответа4

4

Во-первых, обратите внимание на совет Джонатана

Теперь, когда вы сделали это, попробуйте что-то вроде этого

# Find all process that are owner by "tony"
#  - Print out the process id (pid), and the start time (lstart)
# Find all the rows that aren't for today
# Cut that down to just the first field (process id)
PROCS="$(ps -u tony -o pid,lstart | fgrep -v " $( date '+%a %b %d' )" | cut -d' ' -f1)"

# Run through each process and ask it to shutdown
for PROC in $PROCS
do
    kill -TERM $PROC
done

# Wait for 10 seconds to give the processes time to stop
sleep 10

# Kill off any processes that still exist
for PROC in $PROCS
do
    [ -r /proc/${PROC}/status ] && kill -KILL $PROC
done

Хотя вы, возможно, на самом деле не хотите этого делать.
Все процессы привязаны к сеансам. Если вы можете выяснить, каким был ваш старый сеанс VNC, то вы должны иметь возможность убивать процессы, которые принадлежат этому сеансу, а не просто искать "старые" процессы.

1
  1. Будьте очень осторожны, чтобы не уничтожить процессы демона для системы.
  2. Зачем вам нужно убивать процессы Тони старше одного дня?
  3. Отправка SIGKILL (-9) жестока. Лучше отправить SIGTERM (15) и SIGHUP (1) перед отправкой SIGKILL. Сигналы SIGHUP и SIGTERM дают процессу возможность очиститься и выйти из-под контроля; например, простая отправка SIGKILL означает, что заблокированные файлы не могут быть очищены.

Чтобы получить список ваших процессов, запущенных достаточно давно, чтобы у процесса была дата, а не время в поле времени, вы можете использовать:

pids=$(ps -aux |
       awk '$1 ~ /^tony$/ && $9 !~ /[0-2]?[0-9]:[0-5][0-9]/ { print $2; }')
for signal in 15 1 9
do
    kill -$signal $pids 2>/dev/null
    sleep 1
done

Скрипт awk ищет строки, которые начинаются с «tony», но не соответствуют времени в столбце 9 - у них есть дата и, следовательно, «старые». Как и предполагалось, сигнализация выполняется в 3 этапа: завершение, зависание, уничтожение. С осторожностью вы можете передать имя пользователя в сценарий awk вместо того, чтобы вводить имя как tony .

0

В linux вы можете видеть все ваши процессы, которым не менее 24 часов, с

find /proc -name [1-9]* -maxdepth 1 -user tony -mtime +0

и взять их с чем-то вроде

for signal in -TERM -HUP -KILL
do
    kill $signal \
         $(find /proc -name [1-9]* -maxdepth 1 -user tony -mtime +0 | cut -d/ -f3)
    sleep 3
done

Разбор ps - это, конечно, вариант, но я стараюсь избегать этого, потому что параметры и форматы вывода могут очень сильно различаться для этой команды от системы к системе.

0

Если вам не нужно это для сценариев, а только для одноразового требования, вы также должны проверить htop. шаги:

  1. Начни это
  2. Нажмите S (настройка)
  3. Спуститесь в столбцы, выберите НАЧАТЬ
  4. Нажмите < для сортировки, выберите СТАРТ
  5. Выберите процессы, которые вы хотите убить с помощью Space
  6. В качестве альтернативы также используйте \ (обратную косую черту) для фильтрации по имени процесса.
  7. Убить процессы с помощью k.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .