Я даю команду 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
, но мне нравится выполняться в одной команде и также существует много мертвых ожиданий процессов.
Любая справка очень ценилась бы.
Во-первых, обратите внимание на совет 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 была, затем необходимо смочь уничтожить процессы, которые принадлежат той сессии, вместо того, чтобы просто искать "старые" процессы.
Для получения списка процессов, запускаемых достаточно долго назад, что процесс имеет дату вместо времени в поле времени, Вы могли использовать:
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
.
В 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
конечно, опция, но я стараюсь избегать этого, потому что опции и выходные форматы могут так значительно различаться для той команды от системы до системы.