Сценарий оболочки: как сравнить время выполнения процесса с theshold? - PullRequest
1 голос
/ 12 декабря 2011

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

Я могу получить время выполнения примерно как

ps -aux | grep ProgramName | grep -v grep | awk '{print $10}'

Это дает 9:47.31 например.Но куда мне пойти дальше и проверить, превышает ли это, скажем, 10-минутный порог?

Ответы [ 4 ]

3 голосов
/ 12 декабря 2011

Вот вкладыш awk 1, который вам понадобится для вашего случая использования:

ps -o etime -C ProgramName | awk -v MAX=600 '{split($0, a, ":"); if (length(a)==2) sec=a[1]*60+a[2]; else if (length(a)==3) sec=a[1]*3600+a[2]*60+a[3]; if (sec>MAX) print "Elapsed"; else print "Not Elapsed"}'

Также обратите внимание, что ps -o etime -C ProgramName дает вам время с момента запуска ProgramName, поэтому вам не нужно использоватьВаша слишком сложная команда для получения этого времени.

ВАЖНО: Также помните, что для процессов, которые выполнялись более суток, вы получите вывод команды ps в виде чего-то вроде1-21:48:48.У меня нет этого случая в моей команде awk, но вы можете использовать ту же команду awk's split, как я показал выше.

ОБНОВЛЕНИЕ: Согласно комментарию ниже, используйте этоверсия для FreeBSD или любого другого варианта Unix (например, Mac), где опция -C ProgramName недоступна.

ps -o etime=,command= | awk -v MAX=600 '/ProgramName/ && !/awk/ {split($1, a, ":"); if (length(a)==2) sec=a[1]*60+a[2]; else if (length(a)==3) sec=a[1]*3600+a[2]*60+a[3]; if (sec>MAX) print "Elapsed"; else print "Not Elapsed"}'
1 голос
/ 12 декабря 2011

Это будет работать в тех случаях, когда ваша программа работала менее суток

THRESH=360
ps auxwww | grep [P]rocessname | awk '{print $10}' | sed -e 's/:/ /; s/\.[0-9]*$//' | while read m s; do 
  let total=${m}*60+${s}
  if [ $total -gt $THRESH ]; then 
    echo "${total} seconds total is over threshold of ${THRESH} seconds"
  fi
done

Если вам нужны более высокие пороговые значения, вы захотите добавить больше логики к извлечению времени процесса, но в этот момент я поместил бы вещи в скрипт perl / ruby ​​и получил бы информацию через `ps auxww w`

1 голос
/ 12 декабря 2011

Во-первых, вы можете избежать ненужных команд grep -v grep и awk, используя следующее:

$ ps -o time `pidof ProgramName`

На моем компьютере с Linux это время отображается в формате ЧЧ: ММ: СС.

Принимая во внимание, что pidof ProgName может дать более одного значения, вы можете обработать это с помощью tail -n +2|head -1 или чего-то подобного.

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

$ seconds=$(printf "%d * 3600 + %d * 60 + %d\n" $(ps -o time $(pidof ProgramName)|tail -n +2|head -1|sed -e 's/:/ /g')|bc)

Обратите внимание, что время, указанное ps -o time, также может быть в этом формате: D-HH:MM:SS где D - количество дней.

1 голос
/ 12 декабря 2011

Вот один из возможных способов:

for time in `ps auxwww  | awk '{print $10}'`; 
do  
SEC=`echo $time | cut -d":" -f2`; 
MIN=`echo $time | cut -d":" -f1`; 
TOTALTIMEINSEC=`echo $SEC+$MIN*60 | bc`; 
echo "the time in sec is:" $TOTALTIMEINSEC; done

Кстати, вам не нужно выводить -v grep, вы можете сделать:

grep [P]rogramName

Тем не менее, я хотел бы увидеть другое решение, потому что я чувствую, что я использую эти методы ...

...