2008-11-04 131 views
2

我是Linux新手,继承了我们的单个linux服务器的运行。这是我们的SVN服务器,所以它比较重要。如何杀死STIME的一个Linux进程(dangling 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 

这依赖于从 '人ps的' 按照标准格式说明:

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

0

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

PS-FU用户名| awk'$ 5!〜/ [0-9]:[0-9]/{print $ 2}'| xargs的杀

由于ps输出的第五字段示出了具有月/日日龄处理(例如Oct31)和没有的时间(例如12时32分),与AWK正则表达式简单地排除其的那些方法第五场仍然是一个时间。我假设,可能是错误的,ps开始只显示运行超过24小时的进程的日期。

3

冒着建议您重新设计基础架构的风险,我已经使用Apache和mod dav svn而不是svnserve获得了很好的结果 - Apache的httpd在过去十年左右的生产使用之后相当笨拙。

+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 

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命令将删除前导空格fo ř切,

cut命令将输出仅第一场:

16324 

而xargs的命令将每行传递PID作为参数运行kill命令一次。根据需要替换grep语句以匹配您需要的任何内容。

至于为什么svnserve的进程不退出正确,我不知道,我还没有看到这对我的颠覆服务器,你应该打开一个单独的问题这一点。

+0

当pid列中有前导空格 – Ken 2008-11-04 18:36:25

1

我们的CVS/SVN/git的服务器,而不是使用由依靠ps输出看了旧的进程一个cronjob,我们使用了timeout程序。

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

替换“12小时”为您的网站适当的超时(虽然我无法想象大多数人需要超过12小时结账单回购)