GNU/Linux >> Tutoriales Linux >  >> Linux

Elimine todos los procesos que se ejecutan durante más de 5 minutos por un usuario determinado en el script bash de Linux

Solución 1:

kill -9 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print $2}}')

donde "procname" es un nombre de proceso y 300 es un umbral de tiempo de ejecución

Solución 2:

¿Quizás ejecutar el comando de ejecución prolongada como este en un crontab?

timeout -k 300 command

Solución 3:

Mi versión de kill script, aprovechando las dos respuestas anteriores:

#!/bin/bash

#Email to send report
MY_EMAIL="[email protected]"

#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

Filtra el proceso por UID, NOMBRE y, si el tiempo de ejecución excede el límite, elimina los procesos y envía el informe por correo electrónico. Si no necesita ese correo electrónico, puede comentar la última línea.

Solución 4:

Hay un guión aquí que puedes modificar para hacer lo que quieras.

EDIT agregó el script a continuación

#!/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

Solución 5:

Encontré la solución en esta página:http://www.directadmin.com/forum/showthread.php?t=26179

Haz un archivo vacío y llámalo killlongproc.sh

Copia esto:

#!/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;

Detén esto en tu cronjob

15 * * * * * root /{directory}/./killongproc.sh

Linux
  1. Cómo establecer límites en los procesos que ejecutan los usuarios en Linux

  2. ¿Cómo agregar un usuario de Unix/linux en un script Bash?

  3. ejecutar script php (función php) en linux bash

  4. Cómo detener manualmente un script de Python que se ejecuta continuamente en Linux

  5. ¿Cómo usar Ctrl+C para eliminar todos los procesos en segundo plano iniciados en un script Bash?

Las mejores distribuciones de Linux que son más adecuadas para principiantes

Linux:¿registro de subprocesos anteriores que ahora están cerrados?

Linux:¿hay alguna interfaz gráfica de usuario para Linux que no use X11?

9 herramientas de productividad para Linux que merecen su atención

Cómo matar procesos en ejecución en Linux

Master Linux Kill Process usando ps, pgrep, pkill y más