2013-09-26 53 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}"