2

我是 Linux 的新手,并且继承了我们的单个 linux 服务器运行。是我们的SVN服务器,所以比较重要。

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

问题的第一部分是,鉴于我跑

ps -fu cvsuser

并获取进程列表,我怎样才能杀死那些不是今天有 STIME 的进程?例如,像

kill where STIME = Oct30

另一个问题是,有谁知道如何避免这些悬空的 svnserve 进程?(这是另一个问题。)

4

5 回答 5

3

冒着建议你重新设计你的基础设施的风险,我使用 Apache 和 mod dav svn 而不是 svnserve 取得了很好的效果——在过去十年左右的生产使用之后,Apache 的 httpd 是相当防弹的。

于 2008-11-04T17:45:27.203 回答
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”标准格式说明中的以下内容:

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

于 2008-11-04T18:17:55.920 回答
1

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

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

将“12h”替换为适合您网站的超时时间(尽管我无法想象大多数人需要超过 12 小时才能签出单个 repo)

于 2011-12-26T09:10:27.040 回答
0

在我的脑海中,我会做这样的事情:

ps -fu 用户名 | awk '$5 !~ /[0-9]:[0-9]/ { 打印 $2 }' | xargs 杀死

由于 ps 输出的第五个字段显示了包含月/日(例如 Oct31)和不包含时间(例如 12:32)的旧进程,因此带有 awk 的正则表达式会简单地排除那些第五个字段仍然是时间的进程。我假设(可能是错误的) ps 开始仅显示运行时间超过 24 小时的进程的日期。

于 2008-11-04T17:40:59.240 回答
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 命令将删除用于剪切的前导空格,

cut 命令将仅输出第一个字段:

16324

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

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

于 2008-11-04T17:48:04.857 回答