我正在尝试使用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 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
工作但会抛出错误
*更新*
以下是我的代码的直接粘贴:
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 :(得分: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
处理并杀死其他人。
答案 1 :(得分:0)
您正在使用pgrep的返回代码,但如果您需要知道多少,输出可能会更有用。
HOW_MANY_JAVAS = $(pgrep -f 'java' | wc -l)
if ((HOW_MANY_JAVAS > 1)) ; then
echo 'too much Java.'
fi
答案 2 :(得分: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}"