Как убить процесс linux с помощью STIME (зависшие процессы svnserve) - PullRequest
2 голосов
/ 04 ноября 2008

Я новичок в Linux и унаследовал, чтобы наш единственный Linux-сервер работал. Это наш SVN-сервер, поэтому он относительно важен.

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

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

ps -fu cvsuser

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

kill where STIME = Oct30

Другой вопрос: кто-нибудь знает, как избежать этих висящих процессов svnserve? (вот другой вопрос.)

Ответы [ 5 ]

3 голосов
/ 04 ноября 2008

Просто для удовольствия (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

Это опирается на следующее из «СТАНДАРТНЫХ ФОРМАТОВ« man ps »:

Если процесс был запущен менее чем 24 часа назад формат вывода «ЧЧ: ММ: СС», иначе это «ммм дд» (где ммм трехбуквенный месяц имя).

3 голосов
/ 04 ноября 2008

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

1 голос
/ 26 декабря 2011

для нашего сервера cvs / svn / git, вместо того, чтобы использовать 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 часов, чтобы оформить один репо)

0 голосов
/ 04 ноября 2008

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

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

Команда ps найдет все процессы, принадлежащие csvuser, и выведет pid и время запуска:

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 будет запускать команду kill один раз для каждой строки, передающей pid в качестве аргумента. При необходимости замените оператор grep на то, что вам нужно.

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

0 голосов
/ 04 ноября 2008

С макушки головы я бы сделал что-то вроде этого:

ps -fu username | awk '$ 5! ~ / [0-9]: [0-9] / {print $ 2}' | XARGS убивают

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

...