GNU/Linux >> Linux Esercitazione >  >> Linux

Uccidi tutti i processi in esecuzione per più di 5 minuti da un determinato utente nello script linux bash

Soluzione 1:

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

dove "procname" è un nome di processo e300 è la soglia del tempo di esecuzione

Soluzione 2:

Forse esegui il comando di lunga durata come questo in un crontab?

timeout -k 300 command

Soluzione 3:

La mia versione di kill script, che trae vantaggio da entrambe le risposte precedenti:

#!/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 il processo per UID, NAME e se il tempo di esecuzione supera il limite, interrompe i processi e invia il rapporto all'e-mail. Se non hai bisogno di quell'e-mail, puoi semplicemente commentare l'ultima riga.

Soluzione 4:

C'è uno script qui che potresti modificare per fare quello che vuoi.

EDIT ha aggiunto lo script qui sotto

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

Soluzione 5:

Ho trovato la soluzione in questa pagina:http://www.directadmin.com/forum/showthread.php?t=26179

Crea un file vuoto e chiamalo killlongproc.sh

Copia questo:

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

Smettila nel tuo cronjob

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

Linux
  1. Quali sono buoni libri su Linux/Unix per un utente avanzato?

  2. Come posso scrivere uno script bash di Linux che mi dica quali computer sono ACCESI nella mia LAN?

  3. esecuzione di script php (funzione php) in linux bash

  4. Verifica che ci siano almeno due argomenti forniti in uno script bash

  5. Come arrestare manualmente uno script Python che viene eseguito continuamente su Linux

Le migliori distribuzioni Linux più adatte ai principianti

Termina tutti i processi di un utente specifico tramite SSH

Padroneggia il processo di uccisione di Linux utilizzando ps, pgrep, pkill e altro

Come uccidere tutti i processi con un determinato nome parziale?

Quali sono questi processi di Windows su Linux?

Come uccido tutti i processi di un utente usando il loro UID