Как убить все процессы, у которых даты старше, чем сегодня?
Я выдаю команду 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 ответа
Во-первых, обратите внимание на совет Джонатана
Теперь, когда вы сделали это, попробуйте что-то вроде этого
# 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, вы должны иметь возможность убивать процессы, принадлежащие этому сеансу, а не просто искать "старые" процессы.
- Будьте очень осторожны, чтобы не уничтожить процессы демона для системы.
- Зачем вам нужно убивать процессы Тони старше одного дня?
- Отправка 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 - у них есть дата и, следовательно, 'old'. Как и предполагалось, сигнализация выполняется в 3 этапа: завершение, зависание, уничтожение. С осторожностью вы можете передать имя пользователя awk
Сценарий вместо проводного имени как tony
,
Если вам не нужно это для сценариев, а только для разовых требований, вы также должны проверить htop. шаги:
- Начни это
- Нажмите S (настройка)
- Спуститесь к столбцам, выберите НАЧАТЬ
- Нажмите < для сортировки, выберите START
- Выберите процессы, которые вы хотите убить с помощью Space
- Также можно использовать \ (обратную косую черту) для фильтрации по имени процесса.
- Убить процессы с помощью k.
В 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
Это, конечно, вариант, но я стараюсь избегать этого, потому что параметры и выходные форматы могут варьироваться настолько широко для этой команды от системы к системе.