Как изменить формат времени на секунды в PS-p?

Я записал rsync сценарий, который также проверяет, как долго процесс сценария работал.

Это - соответствующая часть:

time=$(ps -p $processid -o etime= | awk -F: '{print $2}') # number of seconds the process is running.

if [ $(ps -ef | grep $(basename $0) &>/dev/null && echo $?) -eq "0" ] && [ "$time" -gt "5" ]; then # Check if there's a running process with the script name which is running for more than 5 seconds.
        echo "$message"
        print_log $message
        print_log "--------- END --------"
        exit 1
fi

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

При выполнении:

ps -p PID -o etime=

Это возвращается, сколько времени процесс работал. Пример:

43:36

Но если процесс работал больше дня, то вывод похож так:

[root@do01 ~]# ps -p 28518 -o etime=
 7-22:43:36

Мой вопрос состоит в том, как я могу получить это число в секундах? потому что я должен удостовериться, что процесс не работал больше 5 секунд.

1
задан 24 June 2015 в 10:26
3 ответа

Вы можете попробовать что-то вроде:

time=$(ps -p $processid -o etime= | tr -d ' ');
time_in_seconds=$(case ${#time} in "8") echo ${time: -2}+${time: -5:2}*60+${time: -8:2}*3600 | bc;;  "5")  echo ${time: -2}+${time: -5:2}*60 | bc;; *) echo $(echo $time | cut -d'-' -f1)*86400+${time: -2}+${time: -5:2}*60+${time: -8:2}*3600 | bc;; esac)
echo $time_in_seconds

В более новых версиях есть опция etimes, которая возвращает время в секундах.

.
2
ответ дан 3 December 2019 в 20:51

Это даст результат за секунды в Ubuntu. Это не работает в RedHat.

ps -p PID -o etimes =

0
ответ дан 3 December 2019 в 20:51

Вот несколько различных решений для платформ, не поддерживающих etimes=. Во-первых, может быть, только для систем Linux

etime=$(date -d "$(stat -c %y /proc/${pid} | cut -d ' ' -f 1,2)" +%s); \
  echo "$(date +%s) - ${etime}" | bc -l

Во-вторых, довольно хороший вариант awk:

ps -o etime= -p "${pid}" | \
  tr -d ' ' | tr '-' ':' | \
  awk -F':' '{ secs=0; split("86400 3600 60 1", t_factor, " "); tf=4; for(i=NF;i>0;i--){secs+=$i*t_factor[tf]; tf--};print secs }'
0
ответ дан 27 July 2020 в 07:19

Теги

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