如何在 ps -p 中将时间格式更改为秒?

如何在 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

您可以尝试以下方法:

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

较新的版本有电子时代以秒为单位返回时间的选项。

答案2

在 Ubuntu 上,这将在几秒钟内给出输出。它在 RedHat 上不起作用。

ps -p PID -o etimes=

答案3

对于不支持 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 }'

相关内容