2013-09-26 52 views
0

我想用pgrep先檢測一個進程是否正在運行,如果是,確定進程是否被意外重複(運行)。如果是這樣,它應該殺死重複的進程。pgrep檢測重複進程

if ! pgrep -f "java" > /dev/null; then 
    echo "Yes its running but there may be duplicates" 
    < Now check for duplicates here and kill if necessary > 
fi 

請幫

* UPDATE *

的ps aux:

debian 2521 3.8 5.4 407212 27524 pts/0 Sl 20:16 0:08 java -cp somefile.jar 

代碼:

if [ $(pgrep -f "somefile.jar" | wc -l) -gt 1 ]; then 
    kill $(pgrep -f "somefile.jar" | grep -v $(pgrep -o "somefile.jar") | awk '{printf $1" "}'); 
fi 

運作,但拋出錯誤

* UPDATE *

這裏是我的代碼直接貼:

if [ $(pgrep -f java | wc -l) -gt 1 ]; then 
    echo "kill $(pgrep -f java | grep -v $(pgrep -of java) | sort -n | uniq | awk '{printf $1" "}')"; 
fi 
+0

你會如何確定哪兩個殺人? PID是數字的那個比另一個高呢? – konsolebox

回答

2

這應該這樣做:

#!/bin/bash 

if [ $(pgrep -f java | wc -l) -gt 1 ]; then 
    kill $(pgrep -f java | grep -v $(pgrep -of java) | sort -n | uniq | awk '{printf $1" "}'); 
fi 

pgrep -o會給你最老的(很可能是第一個)java進程。你想要grep -v處理和殺死其他人。

+0

這很好,但如果我想通過說jar文件運行來識別java進程,該怎麼辦。例如,請參閱上面的編輯。這將允許殺死與應用程序有關的Java,而不會影響共享服務器上的其他Java應用程序。 – Atomiklan

+0

這是我得到的錯誤。我知道它沒有太大的幫助。第16行:kill:(2836) - 沒有這樣的進程 – Atomiklan

+0

@Atomiklan很可能同一個進程被兩個或多個jar文件調用。它被打印兩次。您可以使用'uniq'只打印一次進程ID。看我的編輯。 – iamauser

0

您使用p纖ep的返回代碼,但輸出可能是,如果你更有益需要知道多少。

HOW_MANY_JAVAS = $(pgrep -f 'java' | wc -l) 
if ((HOW_MANY_JAVAS > 1)) ; then 
    echo 'too much Java.' 
fi 
0

一個例子:

# Collect pids of all java processes in sorted order. 
readarray -t PIDS < <(exec pgrep -f java | sort -n) 

# Kill all pids except the first. 
[[ ${#PIDS[@]} -gt 1 ]] && kill "${PIDS[@]:2}"