Как уничтожить все процессы, которые имеют даты, более старые, чем сегодня?

Я даю команду 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, но мне нравится выполняться в одной команде и также существует много мертвых ожиданий процессов.

Любая справка очень ценилась бы.

1
задан 23.08.2012, 16:14

3 ответа

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

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

# 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 была, затем необходимо смочь уничтожить процессы, которые принадлежат той сессии, вместо того, чтобы просто искать "старые" процессы.

4
ответ дан 12.12.2019, 08:36
  1. Очень бойтесь уничтожать процессы демона для системы.
  2. Почему необходимо уничтожить процессы Tony, которые являются более старыми, чем старый день?
  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.

1
ответ дан 12.12.2019, 08:36

В 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
ответ дан 12.12.2019, 08:36

Теги

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