J'ai besoin de la commande pour tuer les processus en cours d'exécution depuis au moins 5 minutes pour un processus donné.
Je devrai exécuter cette commande toutes les cinq minutes environ.
Mille mercis !
(le système est Centos5)
J'ai besoin de la commande pour tuer les processus en cours d'exécution depuis au moins 5 minutes pour un processus donné.
Je devrai exécuter cette commande toutes les cinq minutes environ.
Mille mercis !
(le système est Centos5)
Réponses:
kill -9 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print $2}}')
où "procname" est un nom de processus et 300 est le seuil de temps d'exécution
$(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print "kill "$2}}')
c'est un peu plus fluide mais la réponse est quand même super
Ma version de kill script, tirant parti des deux réponses précédentes:
#!/bin/bash
#Email to send report
MY_EMAIL="example@email.com"
#Process name to kill
NAME_KILL="php"
#UID to kill
UID_KILL=33.
#Time in seconds which the process is allowed to run
KILL_TIME=60
KILL_LIST=()
EMAIL_LIST=()
while read PROC_UID PROC_PID PROC_ETIMES PROC_ETIME PROC_COMM PROC_ARGS; do
if [ $PROC_UID -eq $UID_KILL -a "$PROC_COMM" == "$NAME_KILL" -a $PROC_ETIMES -gt $KILL_TIME ]; then
KILL_LIST+=("$PROC_PID");
MSG="Killing '$PROC_ARGS' which runs for $PROC_ETIME";
EMAIL_LIST+=("$MSG");
echo "$MSG";
fi
done < <(ps eaxo uid,pid,etimes,etime,comm,args | tail -n+2)
if [ ${#KILL_LIST[*]} -gt 0 ]; then
kill -9 ${KILL_LIST[@]}
printf '%s\n' "${EMAIL_LIST[@]}" | mail -s "Long running processes killed" $MY_EMAIL
fi
Il filtre le processus par UID, NAME et si le temps d'exécution dépasse la limite - tue les processus et envoie le rapport par e-mail. Si vous n'avez pas besoin de cet e-mail, vous pouvez simplement commenter la dernière ligne.
J'ai trouvé la solution sur cette page: http://www.directadmin.com/forum/showthread.php?t=26179
Créez un fichier vide et appelez-le killlongproc.sh
#!/bin/bash
# This script will kill process which running more than X hours
# egrep: the selected process; grep: hours
PIDS="`ps eaxo bsdtime,pid,comm | egrep "spamd|exim|mysqld|httpd" | grep " 1:" | awk '{print $2}'`"
# Kill the process
echo "Killing spamd, exim, mysqld and httpd processes running more than one hour..."
for i in ${PIDS}; do { echo "Killing $i"; kill -9 $i; }; done;
Arrête ça dans ton cronjob
15 * * * * * root /{directory}/./killongproc.sh
kill -9
car cela ne donne pas aux processus la possibilité d'effectuer un nettoyage en douceur avant de quitter.
Il y a ici un script que vous pouvez modifier pour faire ce que vous voulez.
EDIT a ajouté le script ci-dessous
#!/bin/bash
#
#Put the UID to kill on the next line
UID_KILL=1001
#Put the time in seconds which the process is allowed to run below
KILL_TIME=300
KILL_LIST=`{
ps -eo uid,pid,lstart | tail -n+2 |
while read PROC_UID PROC_PID PROC_LSTART; do
SECONDS=$[$(date +%s) - $(date -d"$PROC_LSTART" +%s)]
if [ $PROC_UID -eq $UID_KILL -a $SECONDS -gt $KILL_TIME ]; then
echo -n "$PROC_PID "
fi
done
}`
if [[ -n $KILL_LIST ]]
then
kill $KILL_LIST
fi
etimes
de ps
pour vous montrer directement les secondes écoulées depuis le démarrage du processus (pas besoin de le calculer à partir de l'heure de début).
ps
ne prennent pas en charge etimes
(uniquement etime
), c'est une excellente alternative. Je viens d' utiliser quand la réponse haut m'a donné une erreur deps
J'ai dû résoudre une tâche similaire, et elle n'a pas besoin de script. Pour terminer (signal SIGTERM) les processus de l'exécutable "THECOMMAND":
killall -u $USER --older-than 5m THECOMMAND
La restriction à l'utilisateur actuel -u $USER
n'est nécessaire que pour éviter les messages d'erreur inutiles si d'autres utilisateurs exécutent également "THECOMMAND". Dans votre propre crontab utilisateur, vous devez saisir les informations suivantes:
*/5 * * * * killall -u $USER --older-than 5m THECOMMAND
Dans une crontab système (utilisateur 'root'), vous ajouteriez ce qui suit:
*/5 * * * * killall --older-than 5m THECOMMAND
Si vous voulez tuer (SIGKILL) les processus au lieu de les terminer (SIGTERM), envoyez explicitement le signal SIGKILL en ajoutant --signal SIGKILL
aux paramètres. Exemple pour un système crontab:
*/5 * * * * killall --older-than 5m --signal SIGKILL THECOMMAND
-9
être un peu plus convivial pour mes processus et j'ai ajouté ungrep -v defunct |
avantawk
comme autre chose que vous pouvez voirprocname <defunct>
dans votre sortie, ce qui empêcherait la commande awk de renvoyer un PID valide. Et cela casserait la commande kill.