如何通过STIME杀死linux进程(悬空svnserve进程)

时间:2008-11-04 17:25:23

标签: linux svn kill

我是Linux新手,继承了保持我们的单个Linux服务器运行。这是我们的SVN服务器,所以它相对重要。

当有太多的svnserve进程正在运行时,在我有一个cron任务发送给他之前维护它的那个人,因为它们似乎是悬空而不是正确终止。

问题的第一部分是,我运行

ps -fu cvsuser

并获取进程列表,如何杀死那些今天没有STIME的进程?例如,像

kill where STIME = Oct30

另一个问题是,有没有人知道如何避免这些悬空的svnserve流程? (Here's the other question.)

5 个答案:

答案 0 :(得分:3)

冒着建议你重新设计你的基础设施的风险,我使用Apache和mod dav svn而不是svnserve获得了很好的结果 - 在过去十年左右的生产使用之后,Apache的httpd非常防御。

答案 1 :(得分: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

这取决于'man ps'STANDARD FORMAT SPECIFIERS:

中的以下内容
  

如果过程开始不到   24小时前,输出格式是   “HH:MM:SS”,否则就是“mmm dd”   (其中mmm是一个三个字母的月份   名称)。

答案 2 :(得分:1)

对于我们的cvs / svn / git服务器,我们使用ps程序而不是使用通过依赖timeout的输出查找旧进程的cronjob。

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

将“12h”替换为您网站的适当超时时间(虽然我无法想象大多数人需要超过12小时才能查看单个回购)

答案 3 :(得分:0)

在我的头顶,我会做这样的事情:

  

ps -fu用户名| awk'$ 5!〜/ [0-9]:[0-9] / {print $ 2}'| xargs kill

由于ps输出的第五个字段显示带有月/日(例如Oct31)和没有时间(例如12:32)的日常过程,因此带有awk的正则表达式只是排除那些第五个字段仍为a的过程时间。我假设,可能是错误的,ps开始仅显示已经运行超过24小时的进程的日期。

答案 4 :(得分:0)

识别并终止进程:

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命令将为每个传递pid的行作为参数运行kill命令。根据需要替换grep语句以匹配您需要的任何内容。

至于为什么svnserve进程没有正常退出,我不知道,我没有在我的subversion服务器上看到这个,你可能应该为此打开一个单独的问题。