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 -Ops -o etime -p、システムの稼働時間を使用するすべてのツールは、コンテナの(偽)稼働時間ではなくホストの稼働時間を取得します。

関連情報