GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Beenden Sie alle Prozesse, die länger als 5 Minuten von einem bestimmten Benutzer in einem Linux-Bash-Skript ausgeführt werden

Lösung 1:

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

wobei "procname" ein Prozessname und 300 ein Laufzeitschwellenwert ist

Lösung 2:

Vielleicht führen Sie den langlaufenden Befehl so in einer Crontab aus?

timeout -k 300 command

Lösung 3:

Meine Version des Kill-Skripts, die von den beiden vorherigen Antworten profitiert:

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

Es filtert Prozesse nach UID, NAME und wenn die Ausführungszeit das Limit überschreitet – beendet Prozesse und sendet einen Bericht per E-Mail. Wenn Sie diese E-Mail nicht benötigen – können Sie einfach die letzte Zeile kommentieren.

Lösung 4:

hier gibt es ein Skript die Sie ändern könnten, um zu tun, was Sie wollen.

EDIT hat das Skript unten hinzugefügt

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

Lösung 5:

Ich habe die Lösung auf dieser Seite gefunden:http://www.directadmin.com/forum/showthread.php?t=26179

Erstellen Sie eine leere Datei und nennen Sie sie killlongproc.sh

Kopieren Sie dies:

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

Stoppen Sie dies in Ihrem Cronjob

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

Linux
  1. Wie kann ich ein Linux-Bash-Skript schreiben, das mir mitteilt, welche Computer in meinem LAN eingeschaltet sind?

  2. Überprüfen Sie, ob in einem Bash-Skript mindestens zwei Argumente angegeben sind

  3. Wie kann man alle Prozesse mit einem bestimmten Teilnamen beenden?

  4. So stoppen Sie manuell ein Python-Skript, das unter Linux kontinuierlich ausgeführt wird

  5. Wie verwendet man Strg+C, um alle Hintergrundprozesse zu beenden, die in einem Bash-Skript gestartet wurden?

So legen Sie Limits für Benutzerprozesse unter Linux fest

Beste Linux-Distributionen, die am besten für Anfänger geeignet sind

Linux – Protokoll vergangener Threads, die jetzt geschlossen sind?

9 Produktivitätstools für Linux, die Ihre Aufmerksamkeit wert sind

Meistern Sie den Linux-Kill-Prozess mit ps, pgrep, pkill und mehr

Wie beende ich alle Prozesse eines Benutzers mit seiner UID?