2008-11-04 2 views
2

Я новичок в Linux и унаследовал сохранение нашего единого Linux-сервера. Это наш сервер SVN, поэтому он относительно важен.Как убить процесс linux с помощью STIME (оборванных процессов svnserve)

Оказывается, парень, который поддерживал его передо мной, выполнял задание cron, чтобы отправить его по электронной почте, когда запущено слишком много процессов svnserve, поскольку они, похоже, остаются болтающимися, а не прерываются правильно.

Первая часть вопроса, учитывая, что я бегу

ps -fu cvsuser 

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

kill where STIME = Oct30 

Другой вопрос: кто-нибудь знает, как избежать этих обвисших процессов svnserve? (Here's the other question.)

ответ

3

Просто для удовольствия (GNU bash, версия 3.2.39)

ps h -u cvsuser -o pid,start # h - no header, only output pid and start 
    | grep -v ':'    # exclude entries from the last 24 hours 
    | egrep -o '^\ *[0-9]+' # get the pid (handling possible leading space) 
    | xargs -i echo kill "{}" # pretend to kill - take out the echo if you're happy 

Это зависит от следующих от «человека пс» Стандартный формат спецификаторов:

Если процесс был начат менее 24 часов назад, выходной формат «HH: MM : SS ", иначе это" mmm dd " (где mmm - трехбуквенный месяц ).

0

Off верхней части моей головы, я хотел бы сделать что-то вроде этого:

п.с. -fu имя пользователя | awk '$ 5! ~/[0-9]: [0-9]/{print $ 2}' | xargs убить

Поскольку пятое поле выхода пс показывает однодневных процессы с месяц/день (например Oct31) и без времени (например, 12:32), регулярное выражение с AWK просто исключает те процессы, пятое поле - это еще время. Я предполагаю, возможно, ошибочно, что ps начинает показывать дату только для процессов, которые были запущены более 24 часов.

3

С опасностью предложить вам перестроить вашу инфраструктуру, у меня были отличные результаты с использованием Apache и mod dav svn вместо svnserve - httpad Apache был довольно проклят пуленепробиваемым после последнего десятилетия или около того производства.

+0

Я может в конечном итоге переразработки его, по крайней мере, я могу полностью понять и сохранить его. – Instantsoup 2008-11-04 21:02:45

0

Чтобы идентифицировать и уничтожать процессы:

ps h -u csvuser -o pid,lstart | grep 'May 29' | sed 's/^ \+//' | 
cut -d ' ' -f 1 | xargs -n 1 kill 

Команда п.с. найдет все процессы, принадлежащие csvuser и выход ПИД-регулятора и время запуска:

16324 Thu May 29 04:02:06 2008 
22144 Tue Jul 22 04:02:05 2008 
11315 Wed Oct 8 04:02:00 2008 

Команда Grep будет найти дату вы ищете

16324 Thu May 29 04:02:06 2008 

Команда sed удалит ведущие пространства для разреза ,

Команда покрой будет выводить только первое поле:

16324 

И команда xargs будет работать убить команду один раз для каждой линии, проходящей ИДП в качестве аргумента. Замените инструкцию grep по мере необходимости, чтобы соответствовать всем необходимым.

Что касается того, почему процессы svnserve не работают должным образом, я не знаю, я не видел этого на своих серверах subversion, вероятно, вы должны открыть для него отдельный вопрос.

+0

Вырезать не удается, когда в столбце pid есть ведущие пробелы – Ken 2008-11-04 18:36:25

1

для нашего резюме/СВН/мерзавца сервера, а не с помощью cronjob, который выглядел для старых процессов, опираясь на выходе ps, мы использовали программу timeout.

$ grep server /etc/xinetd.d/svnserve 
server   = /usr/bin/timeout 
server_args  = 12h /usr/bin/svnserve -i -R -r /svnroot 

заменить «12h» с соответствующим тайм-аут для вашего сайта (хотя я не могу себе представить, что большинство людей, нуждающихся в более чем 12 часов, чтобы оформить один репо)