2013-09-26 3 views
0

J'essaie d'utiliser pgrep pour d'abord détecter si un processus est en cours d'exécution et si c'est le cas, déterminer si le processus a été dupliqué (exécuté) accidentellement. Si c'est le cas, il devrait tuer les processus en double.pgrep détecter les processus en double

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 

S'il vous plaît aider

* MISE À JOUR *

ps aux:

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

code:

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 

Works mais jette une erreur

* MISE À JOUR *

est ici une pâte directe de mon code:

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

Comment voulez-vous déterminer lequel parmi les deux à tuer? Celui dont le PID est le numéro est plus haut que l'autre? – konsolebox

Répondre

2

Cela devrait faire:

#!/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 vous donnera le plus ancien (le plus probablement le premier) processus java. Vous voulez grep -v qui traite et tue les autres.

+0

Cela fonctionne très bien, mais que faire si je veux identifier le processus java en disant que le fichier jar est en cours d'exécution. Par exemple, voir la modification ci-dessus. Cela permettrait de tuer java appartenant à une application et n'affecte pas les autres applications Java sur un serveur partagé. – Atomiklan

+0

C'est l'erreur que je reçois. Je sais que ce n'est pas beaucoup d'aide. ligne 16: kill: (2836) - Pas de tel processus – Atomiklan

+0

@Atomiklan Probablement le même processus est appelé par deux fichiers jar ou plus. Il est imprimé deux fois. Vous pouvez utiliser 'uniq' pour imprimer l'identifiant du processus une seule fois. Voir ma modification. – iamauser

0

Vous utilisez le code de retour de pgrep, mais la sortie pourrait être plus utile si vous besoin de savoir combien.

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

Un exemple:

# 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}" 
Questions connexes