Как я уничтожаю процессы, более старые, чем “t”?

Никогда не делавшийся это самостоятельно, но возможно Вы могли объединить этот код, который программно создает основы обзора с этим кодом, который добавляет вопросы. Не должно быть слишком трудно сделать своего рода слияние для преобразования электронной таблицы пользователя в код, который создаст вопросы.

14
задан 13 April 2017 в 05:14
16 ответов

Благодаря ответу Christopher я смог адаптировать его к следующему:

find /proc -maxdepth 1 -user apache -type d -mmin +60 -exec basename {} \; \
| xargs ps | grep page.py | awk '{ print $1 }' | sudo xargs kill

-mmin была находка, управляют, чтобы я отсутствовал.

9
ответ дан 20 November 2019 в 23:01

GNU Killall может уничтожить процессы, более старые, чем данный возраст, с помощью их processname.

if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi
21
ответ дан 20 November 2019 в 23:01

72=3 дня 48=2 дня 24=1 день

a1=$(TZ=72 date +%d) ps -ef| cat filex.txt | sed '/[JFMASOND][aepuco][nbrylgptvc] '$a1'/!d' | awk '{ print $2 " " $5 " " $6 }' > file2.txt

это работает :)

-2
ответ дан 20 November 2019 в 23:01

Я не был удовлетворен другим решением, большинство из них является слишком загадочным (мое знание удара отчасти ограничено), и таким образом, я не могу настроить их...
я создал свое собственное решение, Это является, вероятно, не лучшим, но это работает, и это читаемо

, можно сохранить этот сценарий в файле и сделать его исполняемым файлом (в конечном счете называют его с использованием крона)

#!/bin/bash
## time in second that trigger the kill
LIMIT=10
## [] skip the grep from the process list
PROC_NAME="[m]y process name"
## etimes return the time in seconds
TIME_SEC=$(ps axo etimes,pid,command | grep "$PROC_NAME" | awk {'print$1'})
PID=$(ps axo etimes,pid,command | grep "$PROC_NAME" | awk {'print$2'})

if [ -n "$TIME_SEC" ] 
    then
    if (( $TIME_SEC > $LIMIT )); then
        kill $PID
    fi
fi
0
ответ дан 20 November 2019 в 23:01

это должно работать

killall --older-than 1h $proc_name

0
ответ дан 20 November 2019 в 23:01

Я использую этот простой сценарий, требуется два названия аргументов процесса и возраста в секундах.

#!/bin/bash
# first argument name of the process to check
# second argument maximum age in seconds
# i.e kill lighttpd after 5 minutes
#   script.sh lighttpd 300 
process=$1
maximum_runtime=$2
pid=`pgrep $process`
if [ $? -ne 0 ]
then
        exit 0
fi
process_start_time=`stat /proc/$pid/cmdline --printf '%X'`
current_time=`date +%s`
let diff=$current_time-$process_start_time

if [ $diff -gt $maximum_runtime ]
then
        kill -3 $pid
fi
0
ответ дан 20 November 2019 в 23:01

Версия Python с помощью ctime записей процесса в /proc:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# kills processes older than HOURS_DELTA hours

import os, time

SIGNAL=15
HOURS_DELTA=1

pids = [int(pid) for pid in os.listdir('/proc') if pid.isdigit()]

for pid in pids:
    if os.stat(os.path.join('/proc', str(pid))).st_ctime < time.time() - HOURS_DELTA * 3600:
        try:
            os.kill(pid, SIGNAL)
        except:
            print "Couldn't kill process %d" % pid
0
ответ дан 20 November 2019 в 23:01

Я имею сервер с неправильными датами в/proc и нахожу, не работает так, я записал этот сценарий:

#!/bin/bash

MAX_DAYS=7  #set the max days you want here
MAX_TIME=$(( $(date +'%s') - $((60*60*24*$MAX_DAYS)) ))

function search_and_destroy()
{
        PATTERN=$1
        for p in $(ps ux|grep "$PATTERN"|grep -v grep| awk '{ print $2 }')
        do
            test $(( $MAX_TIME - $(date -d "`ps -p $p -o lstart=`" +'%s') )) -ge 0 && kill -9 $p
        done
}

search_and_destroy " command1 "
search_and_destroy " command2 "
0
ответ дан 20 November 2019 в 23:01

Я изменил ответ, который они дали Вам в предыдущем сообщении

ps -eo pid,etime,comm | 
egrep '^ *[0-9]+ +([0-9]+-[^ ]*|[0-9]{2}:[0-9]{2}:[0-9]{2}) +/usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py' | 
awk '{print $1}' | 
xargs kill

, регулярное выражение ищет 2 типа второго аргумента:

  • Дни в форме цифр и знака "минус".
  • Hours:minutes:seconds выражение.

, Который должен соответствовать всему кроме молодых процессов, у кого была бы форма minutes:seconds.

0
ответ дан 20 November 2019 в 23:01

Это - вероятно, излишество, но я стал достаточно любопытным закончить его и тест, что оно работает (над другим именем процесса в моей системе, конечно). Можно уничтожить получение $user и $pid для упрощения regexp, который я только добавил для отладки и не испытывал желание срывать назад. Названные получения от жемчуга 5.10 сбрили бы пару большего количества строк, но это должно работать над более старым жемчугом.

необходимо будет заменить печать уничтожением, конечно, но я не собирался на самом деле уничтожить что-либо в своей собственной системе.

#!/usr/bin/perl -T
use strict; use warnings;

$ENV{"PATH"} = "/usr/bin:/bin";                                                       

my (undef,undef,$hour) = localtime(time);                                             
my $target = $hour - 2; # Flag process before this hour                               
my $grep = 'page.py';                                                   

my @proclist = `ps -ef | grep $grep`;                                                 
foreach my $proc (@proclist)                                                          
{                                                                                     
    $proc =~ /(\w+)\s+(\d+)\s+\d+\s+\d+\s+(.*?).*/;                   
    my $user = $1;                                                                    
    my $pid = $2;                                                                     
    my $stime = $3;                                                                   

    $stime =~ s/(\d+):(\d+)/$1/;                                                      

    # We're going to do a numeric compare against strings that                        
    # potentially compare things like 'Aug01' when the STIME is old                   
    # enough.  We don't care, and we want to catch those old pids, so                 
    # we just turn the warnings off inside this foreach.                              
    no warnings 'numeric';                                                            

    unless ($stime > $target)                                                         
    {                                                                                 
        print "$pid\n";                                                               
    }                                                                                 
}

0
ответ дан 20 November 2019 в 23:01

Проблема

Преобразование etime (прошедшее время) столбец ps команда к секундам. Спецификация времени находится в этом формате [[dd-]hh:]mm:ss. Более новые версии ps имеют etimes столбец который выводы etime значение в секундах.

решение: простая пользовательская функция awk

Эта пользовательская функция awk поддерживает все форматы etime столбец (например, 03-12:30:59, 00:07 и т.д.). Просто вставьте его в своем awk сценарии, это - остроты дружественное решение.

function sec(T){C=split(T,A,"[:-]"); return A[C>3?C-3:99]*86400 + A[C>2?C-2:99]*3600 + A[C>1?C-1:99]*60 + A[C>0?C-0:99]*1}
  • sec(T) преобразовывает T в секунды
  • T спецификация времени в [1 113] формат (например, etime)
  • C количество полей в [1 116] (эквивалентный переменной awk NF)
  • A массив полей в [1 118] (эквивалентный переменной $ awk)
  • A[C>3?C-3:99], это - безопасный способ сослаться на четвертое значение (т.е. количество дней) в обратном порядке. Этот подход полезен, потому что дни и часы являются дополнительными. Если массив не достаточно долог, он разыменовывает A[99], который уступит 0 значение. Я принимаю 99, достаточно высоко для большинства вариантов использования.
  • секунды возвратов как целое число

пример Реального мира

Эта острота удара уничтожит soffice.bin процесс, работающий при текущем пользователе, если процесс будет более старым, чем 180 секунд.

kill -9 $(ps cx -o command,etime,pid | awk '/^soffice.bin/ {if (sec($2)>180) {print $3}} function sec(T){C=split(T,A,"[:-]"); return A[C>3?C-3:99]*86400 + A[C>2?C-2:99]*3600 + A[C>1?C-1:99]*60 + A[C>0?C-0:99]*1}')
4
ответ дан 20 November 2019 в 23:01
apt-get install psmisc

killall -o 1h $proc_name
4
ответ дан 20 November 2019 в 23:01

Я думаю, что можно изменить некоторые из тех предыдущих ответов для установки потребностям. А именно:

for FILE in (find . -maxdepth 1 -user processuser -type d -mmin +60)
  do kill -9 $(basename $FILE) # I can never get basename to work with find's exec.  Let me know if you know how!
done

Или

ps -eo pid,etime,comm | awk '$2!~/^..:..$/ && $3~/page\.py/ { print $1}' | kill -9

я думаю, что второе может лучше всего соответствовать Вашим потребностям. Версия находки завершила бы уничтожение других процессов тем пользователем


- Christopher Karel

4
ответ дан 20 November 2019 в 23:01
# get elapsed time in seconds, filter our only those who >= 3600 sec
ps axh -O etimes  | awk '{if ($2 >= 3600) print $2}'

, Если Вы хотите Вас, может питаться ps списком PIDs к поиску в, для, например:

ps h -O etimes 1 2 3
5
ответ дан 20 November 2019 в 23:01

найдите не всегда работает, не, каждая система имеет etimes в наличии, и это мог бы быть мой regex newb состояние, но я не думаю, что Вам нужны что-то большее чем это:

ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
  • список все процессы и предоставляют столбцы PID, ПРОТЕК (etimes =, секунды), КОМАНДА, ПОЛЬЗОВАТЕЛЬ, TT (благодарит @ahoffman)
  • с печатью awk PID, где 4-й столбец (4$, ПОЛЬЗОВАТЕЛЬ) содержат текст 'разработчик', и 5-й столбец (5$, TT) содержат текст 'pts', и столбец ELAPSED имеет значение, больше, чем 600 секунд (благодарит @amtd)

, можно затем передать это по каналу для уничтожения или независимо от того, что потребность может быть.

8
ответ дан 20 November 2019 в 23:01

lstart поле в ps дает последовательный формат времени, который мы можем подать к date для преобразования в секунды с эпохи. Затем мы просто сравниваем это с текущим временем.

#!/bin/bash
current_time=$(date +%s)
ps axo lstart=,pid=,cmd= |
    grep page.py |
    while read line
    do
        # 60 * 60 is one hour, multiply additional or different factors for other thresholds 
        if (( $(date -d "${line:0:25}" +%s) < current_time - 60 * 60 ))
        then
            echo $line | cut -d ' ' -f 6    # change echo to kill
        fi
    done
1
ответ дан 20 November 2019 в 23:01

Теги

Похожие вопросы