我是Linux新手,继承了保持我们的单个Linux服务器运行。这是我们的SVN服务器,所以它相对重要。
当有太多的svnserve进程正在运行时,在我有一个cron任务发送给他之前维护它的那个人,因为它们似乎是悬空而不是正确终止。
问题的第一部分是,我运行
ps -fu cvsuser
并获取进程列表,如何杀死那些今天没有STIME的进程?例如,像
kill where STIME = Oct30
另一个问题是,有没有人知道如何避免这些悬空的svnserve流程? (Here's the other question.)
答案 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服务器上看到这个,你可能应该为此打开一个单独的问题。