web-dev-qa-db-fra.com

Script shell pour capturer l'ID de processus et le tuer s'il existe

J'ai essayé ce code et ça ne marche pas

#!/bin/sh

#Find the Process ID for syncapp running instance

PID=`ps -ef | grep syncapp 'awk {print $2}'`

if [[ -z "$PID" ]] then
Kill -9 PID
fi

Il montre une erreur près de awk.

Toutes les suggestions s'il vous plaît.

53
user1597811

En fait, le moyen le plus simple consiste à passer des arguments de type kill, comme ci-dessous:

ps -ef | grep your_process_name | grep -v grep | awk '{print $2}' | xargs kill

J'espère que ça aide.

123
Anthony Mutisya

Cela fonctionne bien pour moi.

 PID = `ps -eaf | grep syncapp | grep -v grep | awk '{print $ 2}' `
 if [[" "!! =" $ PID "]]; puis
 echo "massacre $ PID" 
 tuer -9 $ PID 
 fi 
12
N Dierauf

J'utilise la commande pkill pour ceci:

NAME
       pgrep, pkill - look up or signal processes based on name and 
       other attributes

SYNOPSIS
       pgrep [options] pattern
       pkill [options] pattern

DESCRIPTION
       pgrep looks through the currently running processes and lists 
       the process IDs which match the selection criteria to stdout.
       All the criteria have to match.  For example,

              $ pgrep -u root sshd

       will only list the processes called sshd AND owned by root.
       On the other hand,

              $ pgrep -u root,daemon

       will list the processes owned by root OR daemon.

       pkill will send the specified signal (by default SIGTERM) 
       to each process instead of listing them on stdout.

Si votre code est exécuté via un interpréteur (Java, python, ...), le nom du processus est le nom de l'interpréteur Vous devez utiliser l'argument --full. Cela correspond au nom de la commande et aux arguments.

9
guettli

Vous vouliez probablement écrire

`ps -ef | grep syncapp | awk '{print $2}'`

mais je vais approuver la réponse de @ PaulR - killall -9 syncapp est une bien meilleure alternative.

4
Amadan

De nombreux systèmes * NIX ont également pkill (1) et killall (1) , ou les deux, ce qui vous permet de tuer les processus par leur nom. En les utilisant, vous pouvez éviter tout le problème d'analyse ps.

1
jbr

Entré quelque part ... pensais que c'est simple et utile

Vous pouvez utiliser la commande directement dans crontab,

* * * * * ps -lf | grep "user" |  Perl -ane '($h,$m,$s) = split /:/,$F
+[13]; kill 9, $F[3] if ($h > 1);'

ou, nous pouvons l'écrire en tant que script Shell,

#!/bin/sh
# longprockill.sh
ps -lf | grep "user" |  Perl -ane '($h,$m,$s) = split /:/,$F[13]; kill
+ 9, $F[3] if ($h > 1);'

Et appelez ça crontab comme ça,

* * * * * longprockill.sh
0
user3743785

Cela devrait tuer tous les processus correspondant au grep que vous êtes autorisé à tuer.

-9 signifie "Tuez tous les processus que vous pouvez tuer".

kill -9 $(ps -ef | grep [s]yncapp | awk '{print $2}')
0
EvR2f
#!/bin/sh

#Find the Process ID for syncapp running instance

PID=`ps -ef | grep syncapp 'awk {print $2}'`

if [[ -z "$PID" ]] then
--->    Kill -9 PID
fi

Vous ne savez pas si cela vous aidera, mais «tuer» n'est pas orthographié correctement… .. c'est en majuscule.

Essayez de "tuer" à la place.

0
AnonManon