0

我正在尝试使用 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

请帮忙

* 更新 *

ps辅助:

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

工作但抛出错误

* 更新 *

这是我的代码的直接粘贴:

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
4

3 回答 3

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那个过程并杀死其他人。

于 2013-09-26T20:06:38.353 回答
0

您正在使用 pgrep 的返回码,但如果您需要知道有多少,输出可能会更有用。

HOW_MANY_JAVAS = $(pgrep -f 'java' | wc -l)
if ((HOW_MANY_JAVAS > 1)) ; then
  echo 'too much Java.'
fi
于 2013-09-26T20:06:00.183 回答
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}"
于 2013-09-26T20:06:00.257 回答