Я написал сценарий 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 секунд.
Вы можете попробовать что-то вроде:
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 =. Сначала возможно только системы 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 }'
Это даст результат за секунды на Ubuntu. Это не работает на RedHat.
ps -p PID -o etimes=