Wie beenden Sie alle Linux-Prozesse, die älter als ein bestimmtes Alter sind?

14 answers
  • Ich habe eine Antwort gefunden, die für mich funktioniert:

    Warnung: Hier werden lang laufende Prozesse gefunden und beendet

     ps -eo uid,pid,etime | egrep '^ *user-id' | egrep ' ([0-9]+-)?([0-9]{2}:?){3}' | awk '{print $2}' | xargs -I{} kill {}
     

    (wobei Benutzer-ID eine bestimmte Benutzer-ID mit langer Prozesse ausführen.)

    Der zweite reguläre Ausdruck entspricht der Uhrzeit, zu der eine optionale Tageszahl angegeben ist, gefolgt von einer Stunde, einer Minute und einer zweiten Komponente. Dies entspricht mindestens einer Stunde in der Länge.

    12 May 2013
    KelvinAddersUK
  • Wenn sie nur getötet werden müssen:

     if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h someprocessname;fi
     

    Wenn Sie sehen wollen, was es ist Abgleich

     if [[ "$(uname)" = "Linux" ]];then killall -i --older-than 1h someprocessname;fi
     

    Das -i -Flag fordert Sie zu jedem Prozessabgleich mit Ja / Nein auf.

    10 May 2012
    Jodie C
  • Wenn Sie älter als einen Tag sind, erhalten Sie

     ps aux
     

    die Antwort, aber es sinkt auf Taggenauigkeit, was möglicherweise nicht so nützlich ist.

     USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0   7200   308 ?        Ss   Jun22   0:02 init [5]
    root         2  0.0  0.0      0     0 ?        S    Jun22   0:02 [migration/0]
    root         3  0.0  0.0      0     0 ?        SN   Jun22   0:18 [ksoftirqd/0]
    root         4  0.0  0.0      0     0 ?        S    Jun22   0:00 [watchdog/0]
     

    Wenn Sie mit Linux oder einem anderen arbeiten System mit dem / proc-Dateisystem. In diesem Beispiel können Sie nur sehen, dass Prozess 1 seit dem 22. Juni läuft, aber keine Angabe der Uhrzeit, zu der er gestartet wurde.

     stat /proc/<pid>
     

    gibt Ihnen eine genauere Antwort. Hier ist zum Beispiel ein genauer Zeitstempel für Prozess 1, der nur als Jun22 angezeigt wird:

     ohm ~$ stat /proc/1
      File: `/proc/1'
      Size: 0               Blocks: 0          IO Block: 4096   directory
    Device: 3h/3d   Inode: 65538       Links: 5
    Access: (0555/dr-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2008-06-22 15:37:44.347627750 -0700
    Modify: 2008-06-22 15:37:44.347627750 -0700
    Change: 2008-06-22 15:37:44.347627750 -0700
     
    09 August 2008
    Mark Harrisonyukondude
  • So erhalten Sie die Liste der zehn ältesten Prozesse:

     ps -elf | sort -r -k12 | Kopf -n 10 
    08 August 2008
    ggasp
  • Perls Proc :: ProcessTable führt den Trick aus: http: / /search.cpan.org/dist/Proc-ProcessTable/

    Sie können es in debian oder ubuntu mit sudo apt-get install libproc-processtable-perl

    Hier ist ein Einzeiler:

     perl -MProc::ProcessTable -Mstrict -w -e 'my $anHourAgo = time-60*60; my $t = new Proc::ProcessTable;foreach my $p ( @{$t->table} ) { if ($p->start() < $anHourAgo) { print $p->pid, "\n" } }'
     

    Oder formatierter in ein Datei mit dem Namen process.pl:

    [&&3&&<
    
    

    und dann perl process.pl

    ausführen

    Dies gibt Ihnen mehr Flexibilität und eine Auflösung von 1 Sekunde bei der Startzeit.

    13 August 2010
    Peter V. Mørch
  • Jodie C und andere haben darauf hingewiesen, dass killall -i verwendet werden kann. Dies ist in Ordnung, wenn Sie den Prozessnamen zum Abbrechen verwenden möchten. Wenn Sie jedoch mit denselben Parametern wie pgrep -f töten möchten, müssen Sie Folgendes verwenden, indem Sie pure bash und das Dateisystem /proc verwenden.

     #!/bin/sh                                                                                                                                               
    
    max_age=120 # (seconds)                                                                                                                                 
    naughty="$(pgrep -f offlineimap)"                                                                                                                       
    if [[ -n "$naughty" ]]; then # naughty is running                                                                                                       
      age_in_seconds=$(echo "$(date +%s) - $(stat -c %X /proc/$naughty)" | bc)                                                                              
      if [[ "$age_in_seconds" -ge "$max_age" ]]; then # naughty is too old!                                                                                 
        kill -s 9 "$naughty"                                                                                                                                
      fi                                                                                                                                                    
    fi     
     

    Hiermit können Sie Prozesse suchen und beenden, die älter als max_age Sekunden sind, indem Sie den vollständigen Prozessnamen verwenden. Das heißt, der Prozess mit dem Namen /usr/bin/python2 offlineimap kann durch Verweis auf "offlineimap" abgebrochen werden, wohingegen die hier vorgestellten Lösungen killall nur für die Zeichenfolge "python2" funktionieren.

    14 May 2013
    g33kz0r
  • Sie können bc verwenden, um die beiden Befehle in der Antwort von Mob zu verknüpfen und zu ermitteln, wie viele Sekunden seit dem Prozessbeginn vergangen sind:

     echo `date +%s` - `stat -t /proc/<pid> | awk '{print $14}'` | bc
     

    edit:

    Aus Langeweile beim Warten auf lange Prozesse wird dies nach ein paar Minuten Fummeln herauskommen:

     #file: sincetime
    #!/bin/bash
    init=`stat -t /proc/$1 | awk '{print $14}'`
    curr=`date +%s`
    seconds=`echo $curr - $init| bc`
    name=`cat /proc/$1/cmdline`
    echo $name $seconds
     

    Wenn Sie dies auf Ihren Pfad setzen und es so nennen: sincetime

    wird die Prozess-Cmdline und Sekunden seit dem Start gedruckt. Sie können dies auch in Ihren Pfad einfügen:

     #file: greptime
    #!/bin/bash
    pidlist=`ps ax | grep -i -E $1 | grep -v grep | awk '{print $1}' | grep -v PID | xargs echo`
    for pid in $pidlist; do
        sincetime $pid
    done
     

    Und wenn Sie ausführen:

     greptime <pattern>
     

    Wenn Muster ein String oder ein erweiterter regulärer Ausdruck ist, werden alle Prozesse ausgedruckt, die diesem Muster entsprechen, und die Sekunden seit ihrem Start. :)

    15 June 2012
    Rafael S. Calsaverini
  • führen Sie ein ps -aef aus. Dadurch wird Ihnen die Uhrzeit angezeigt, zu der der Prozess gestartet wurde. Suchen Sie dann mit dem Befehl date die aktuelle Uhrzeit. Berechnen Sie die Differenz zwischen den beiden, um das Alter des Prozesses zu ermitteln.

    09 November 2011
    Jason Planke2p
  • stat -t /proc/<pid> | awk '{print $14}'

    , um die Startzeit des Prozesses in Sekunden seit der Epoche abzurufen. Vergleichen Sie mit der aktuellen Uhrzeit (date +%s), um das aktuelle Alter des Prozesses zu ermitteln.

    16 February 2012
    mob
  • Ich habe etwas Ähnliches wie die akzeptierte Antwort gemacht, aber etwas anders, da ich basierend auf dem Prozessnamen und dem schlechten Prozess, der mehr als 100 Sekunden lang läuft, übereinstimmen möchte.

     kill $(ps -o pid,bsdtime -p $(pgrep bad_process) | awk '{ if ($RN > 1 && $2 > 100) { print $1; }}')
     
    11 August 2011
    Rodney Amato