非特权 LXC (proxmox) 中的 Debian 12.2。现在已经是当地时间上午 11 点 45 分左右了。早上 5:00,cron 启动了一个脚本:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
jan 26633 0.0 0.0 8500 2056 ? S 05:00 0:00 /usr/sbin/CRON -f
我正在使用pgrep -f CRON -O 600
pgrep,并且我希望 pgrep 返回 PID 26633,因为该进程的时间早于 600 秒。但 pgrep 什么也没返回。如果我省略-O
,它会正确返回 PID。
在主机上(即 LXC 之外)执行相同操作,它可以正常工作。
由于 pgrep 使用 procps,所以我查看了那里。
ps -o etime -p $pid
在 LXC 中441077225-02:04:48
:(错误,因为从 5:00 开始,~6:45 过去了)
ps -o etime -p $pid
在主机上:(06:43:29
正确)
这是 procps 中的错误还是与 LXC 有关?
LXC 安装一个假的
/proc/uptime
来模拟容器的正常运行时间而不是主机的正常运行时间,因为该属性没有命名空间。在(根)LXC 容器上:但是
stat
./proc/PID/stat
_因此,当比较时间时,它会产生电流和procps 源中所述的字段
pgrep
之间的差异:/proc/uptime
starttime
/proc/PID/stat
proc(5)
由于容器
/proc/uptime
是由 LXC 伪造的(我猜是通过使用主机的减去 LXC 容器的 pid 1 启动时间),最终结果减去/proc/uptime
容器的启动时间,导致最初为负值(并且有一段时间,但无论如何仍然是错误的)如果/当它稍后变为正值时)这是意外的,因为系统正常运行时间应该大于目标的进程 start_time (可能按 因子调整)。procps工具无法正确处理这个问题。$(getconf CLK_TCK)
我不知道解决方法:如果
/proc/uptime
恢复到其主机值,则pgrep -O
或ps -o etime -p
将计算正确的值,但任何使用系统正常运行时间的工具现在都将获取主机的正常运行时间,而不是容器的(伪造的)正常运行时间。