2008-11-04 92 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小時結賬單回購)