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