Команда Shell PS под Ubuntu - PullRequest
       0

Команда Shell PS под Ubuntu

0 голосов
/ 12 апреля 2011

У меня вопрос по поводу сценариев оболочки.Я пытаюсь быть максимально конкретным.Итак, мне нужно написать скрипт оболочки мониторинга, в котором я должен записать в файл всех пользователей, которые запускают команду vi больше, чем за одну минуту.Я не имею никакого представления о подходе, за исключением того, что я должен использовать команду ps.У меня есть что-то вроде этого:

ps -ewo "% t% u% c% g" |grep '\ '

с этим я получаю время и пользователей, которые запускают команду vi.Проблема в том, что я не знаю, как разобрать результат этой команды.Может кто-нибудь помочь, пожалуйста?Все ответы приветствуются.Спасибо

Ответы [ 4 ]

1 голос
/ 13 апреля 2011

Я буду использовать awk:

ps eo user,etime,pid,args --no-heading -C vi | awk '{MIN=int(substr($2,0,2)); printf "minutes=%s pid=%d\n", MIN, $3; }'

Обратите внимание, что вам не нужно grep для "vi", вы можете использовать "ps -C procname".

0 голосов
/ 11 апреля 2014
#!/bin/sh
# -e           :: all processes (inluding other users')
# -o           :: define output format
# user         :: user name
# etimes       :: time in seconds after the process was started
# pid          :: process id
# comm         :: name of the executable
# --no-headers :: do not print column names
ps -eo user,etimes,pid,comm --no-headers |
awk '
# (...)       :: select only rows that meet the condition in ()
# $4 ~ //     :: 4th field (comm) should match the pattern in //
# (^|\/)vim?$ :: beginning of the line or "/", then "vi",
#                nothing or "m" (to capture vim), end of the line
# $2 > 60     :: 2nd field (etimes) >= 60 seconds
($4 ~ /(^|\/)vim?$/ && $2 >= 60){
# convert 2nd field (etimes) into minutes
  t = int($2 / 60);
# check if the time is more than 1 minute
  s = (t > 1) ? "s" : "";
# output
  printf "user %s : [%s] (pid=%d) started %d minute%s ago\n", $1, $4, $3, t, s;
}'
0 голосов
/ 12 апреля 2011

Если у вас есть Ruby (1.9 +)

#!/usr/bin/env ruby 

while true
    process="ps eo user,etime,args"
    f = IO.popen(process) #call the ps command
    f.readlines.each do|ps|
        user, elapsed, command = ps.split
        if command["vi"] && elapsed > "01:00"
            puts "User #{user} running vi for more than 1 minute: #{elapsed}"
        end
    end
    f.close
    sleep 10 # sleep 10 seconds before monitoring again
end
0 голосов
/ 12 апреля 2011

Вот что я бы сделал:

ps fo "etime,user" --no-heading --sort 'uid,-etime' $(pgrep '\<vi\>') |
    perl -ne '($min,$sec,$user) = (m/^\s+(\d\d):(\d\d)\s+(\w+)$/mo); 
               print "$user\t$min:$sec\n" unless ((0+$min)*60+$sec)<60'

Нажмите на | cut -f1 | uniq или | cut -f1 | uniq -c, чтобы получить более хорошие характеристики

Обратите внимание, что так это легко сформулироватьчтобы переключить тест на 59 секунд или 3мин11с, если хотите, изменив <60, например, <191 (для 3м11с)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...