LXC에서 "pgrep -O 600"이 실패하는 이유는 무엇입니까? 프로그램 오류인가요?

LXC에서 "pgrep -O 600"이 실패하는 이유는 무엇입니까? 프로그램 오류인가요?

권한이 없는 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은 아무것도 반환하지 않습니다. 생략하면 -OPID가 올바르게 반환됩니다.

호스트(즉, LXC 외부)에서도 동일한 작업을 수행하면 제대로 작동합니다.
pgrep은 procps를 사용하므로 거기를 살펴보았습니다.
ps -o etime -p $pidLXC에서: ( 441077225-02:04:48 5:00에 시작하여 ~6:45가 지났기 때문에 잘못된 것임)
ps -o etime -p $pid호스트에서: ( 06:43:29 올바른)

이것은 procps의 버그입니까, 아니면 LXC와 관련된 것입니까?

답변1

/proc/uptimeLXC는 이 속성에 대한 네임스페이스가 없기 때문에 호스트의 가동 시간이 아닌 컨테이너의 가동 시간을 시뮬레이션하기 위해 가짜 속성을 설치합니다 . (루트) 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/uptimestarttime/proc/PID/statproc(5)그리고소품 출처:

    PIDS_TIME_ELAPSED,      //     real     *  derived from stat: (/proc/uptime - start_time) / hertz

컨테이너는 /proc/uptimeLXC에 의해 위조되었으므로(호스트의 /proc/uptime시작 시간에서 LXC 컨테이너의 pid 1을 뺀 값인 것 같습니다) 최종 결과는 컨테이너의 시작 시간입니다.마이너스, 결과적으로 처음에는 음수 값이 발생하지만(잠시 동안은 나중에 양수가 될 경우 여전히 잘못된 값임) 시스템 가동 시간이 대상의 프로세스 start_time보다 커야 하기 때문에 예상치 못한 결과입니다(아마도 요인에 의해 조정됨) $(getconf CLK_TCK). .프로세스도구는 이를 올바르게 처리할 수 없습니다.

해결 방법을 모르겠습니다. /proc/uptime호스트 값으로 되돌리면 올바른 값을 계산 pgrep -O하지만 ps -o etime -p시스템 가동 시간을 사용하는 모든 도구는 이제 컨테이너의 (가짜) 가동 시간이 아닌 호스트의 가동 시간을 얻습니다.

관련 정보