以秒为单位获取进程经过的时间

alt*_*dky 2 shell quoting

类似于如何检查进程运行了多长时间?,我正在尝试使用 BusyBox 和sh(不是bash)在嵌入式 Linux 系统中以秒为单位获取进程的经过时间。不同之处在于我希望它以纯秒为单位,而不是 mm:ss 格式。

我可以从结果中解析它,ps但无法expr从 mm:ss 转换为秒。使用set -vx来帮助调试,我可以看到有效的expr命令,但它失败,出现语法错误。复制和粘贴它工作正常。

运行此添加诊断后:

root@embedded:~# set -vx
Run Code Online (Sandbox Code Playgroud)

我输入:

root@embedded:~# $(/opt/bin/busybox ps -o pid,etime,time | grep 1156 | sed "s/ *[0-9]\+ \+\([0-9]\+\):\([0-9]\+\) .*/\/opt\/bin\/busybox expr \1 \\\* 60 + \2/")
Run Code Online (Sandbox Code Playgroud)

并得到这个回应:

$(/opt/bin/busybox ps -o pid,etime,time | grep 1156 | sed "s/ *[0-9]\+ \+\([0-9]\+\):\([0-9]\+\) .*/\/opt\/bin\/busybox expr \1 \\\* 60 + \2/")
+ /opt/bin/busybox ps -o pid,etime,time
+ grep 1156
+ sed s/ *[0-9]\+ \+\([0-9]\+\):\([0-9]\+\) .*/\/opt\/bin\/busybox expr \1 \\* 60 + \2/
+ /opt/bin/busybox expr 2 \* 60 + 03
expr: syntax error
root@embedded:~#
Run Code Online (Sandbox Code Playgroud)

我还尝试了多层\转义和''.

我需要做什么才能将 转义*expr命令行?

yae*_*shi 5

eval 可能对这个案子有帮助...

~ $ $(echo expr 1 \\* 2)
+ echo expr 1 \* 2
+ expr 1 \* 2
expr: syntax error
~ $ eval $(echo expr 1 \\* 2)
+ echo expr 1 \* 2
+ eval expr 1 \* 2
+ expr 1 * 2
2
Run Code Online (Sandbox Code Playgroud)

/proc/$pid/stat在 Linux上查找可能会更好。

pid=1155
hz=$(getconf CLK_TCK)
uptime=$(awk '{print $1}' < /proc/uptime)
starttime=$(awk '{print $22}' < /proc/$pid/stat)
echo $(( ${uptime%.*} - $starttime / $hz ))
Run Code Online (Sandbox Code Playgroud)

如果/usr/bin/getconf不可用,您需要找到系统的CLK_TCK(或USER_HZ)值。我认为在大多数情况下您可以将其假定为 100。