권한이 없는 LXC(proxmox)의 Debian 12.2. 현재 현지 시간으로 오전 11시 45분쯤이다. 아침 5시에 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 을 사용하고 pgrep -f CRON -O 600
있으며 프로세스가 600초보다 훨씬 오래되었기 때문에 pgrep이 PID 26633을 반환하도록 하려고 합니다. 그러나 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와 관련된 것입니까?
답변1
/proc/uptime
LXC는 이 속성에 대한 네임스페이스가 없기 때문에 호스트의 가동 시간이 아닌 컨테이너의 가동 시간을 시뮬레이션하기 위해 가짜 속성을 설치합니다 . (루트) LXC 컨테이너에서:
# findmnt /proc/uptime
TARGET SOURCE FSTYPE OPTIONS
/proc/uptime lxcfs[/proc/uptime] fuse.lxcfs rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other
그러나 stat
프로세스별 의사 파일에 대해서는 그러한 조항이 제공되지 않습니다 /proc/PID/stat
.
따라서 시간을 비교할 때 pgrep
아래 설명과 같이 전류와 자기장의 차이가 있습니다./proc/uptime
starttime
/proc/PID/stat
proc(5)
그리고소품 출처:
PIDS_TIME_ELAPSED, // real * derived from stat: (/proc/uptime - start_time) / hertz
컨테이너는 /proc/uptime
LXC에 의해 위조되었으므로(호스트의 /proc/uptime
시작 시간에서 LXC 컨테이너의 pid 1을 뺀 값인 것 같습니다) 최종 결과는 컨테이너의 시작 시간입니다.마이너스, 결과적으로 처음에는 음수 값이 발생하지만(잠시 동안은 나중에 양수가 될 경우 여전히 잘못된 값임) 시스템 가동 시간이 대상의 프로세스 start_time보다 커야 하기 때문에 예상치 못한 결과입니다(아마도 요인에 의해 조정됨) $(getconf CLK_TCK)
. .프로세스도구는 이를 올바르게 처리할 수 없습니다.
해결 방법을 모르겠습니다. /proc/uptime
호스트 값으로 되돌리면 올바른 값을 계산 pgrep -O
하지만 ps -o etime -p
시스템 가동 시간을 사용하는 모든 도구는 이제 컨테이너의 (가짜) 가동 시간이 아닌 호스트의 가동 시간을 얻습니다.