星期六, 2月 24, 2018

Acct with openSUSE Leap 42.3

Acct with openSUSE Leap 42.3

OS: openSUSE Leap 42.3 in Azure

之前看到的文章, How to Monitor User Activity with psacct or acct Tools
今天找機會來實作一下

先搜尋相關套件
在 openSUSE 這邊是 acct 套件

# zypper  search   acct
Loading repository data...
Reading installed packages...

S | Name                     | Summary                                                | Type      
--+--------------------------+--------------------------------------------------------+-----------
 | acct                     | User-Specific Process Accounting                       | package   

安裝 acct 套件

# zypper  install  acct
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following NEW package is going to be installed:
 acct

1 new package to install.
Overall download size: 65.7 KiB. Already cached: 0 B. After the operation, additional 161.1 KiB will be used.
Continue? [y/n/...? shows all options] (y): Y

確認服務狀態

# systemctl   status  acct.service
● acct.service - Process accounting
  Loaded: loaded (/usr/lib/systemd/system/acct.service; disabled; vendor preset: disabled)
  Active: inactive (dead)
    Docs: man:accton(8)

啟動 acct 服務

# systemctl  start  acct.service

再次觀察服務

# systemctl   status   acct.service
● acct.service - Process accounting
  Loaded: loaded (/usr/lib/systemd/system/acct.service; disabled; vendor preset: disabled)
  Active: active (exited) since Sat 2018-02-24 11:29:28 UTC; 3s ago
    Docs: man:accton(8)
 Process: 21556 ExecStart=/usr/sbin/accton /var/log/account/pacct (code=exited, status=0/SUCCESS)
 Process: 21552 ExecStartPre=/usr/bin/chmod 600 /var/log/account/pacct (code=exited, status=0/SUCCESS)
Main PID: 21556 (code=exited, status=0/SUCCESS)

設定開機啟動

# systemctl  enable  acct.service
Created symlink from /etc/systemd/system/multi-user.target.wants/acct.service to /usr/lib/systemd/system/acct.service.

確認相關設定

# systemctl  is-enabled  acct.service
enabled

參考網路上找到的 ac 指令 man page

# ac  --help
               Usage: ac [-dhpVy] [-f <file>] [people] ...
               [--daily-totals] [--individual-totals] [--file <file>]
               [--complain] [--reboots] [--supplants] [--timewarps] [--print-year]
               [--compatibility] [--print-zeros] [--debug] [--tw-leniency <value>]
               [--tw-suspicious <value>] [--version] [--help]

The system's default login accounting file is /var/log/wtmp

ac 是使用 /var/log/wtmp 來進行相關資訊報告
  • ac prints out a report of connect time (in hours) based on the logins/logouts in the current wtmp file. A total is also printed out.

wtmp 檔案如果用 vim 或是 cat 方式, 是人類看不懂的, 在網路上面搜尋之後, 是使用 last 指令來觀察

# last  -f   /var/log/wtmp
sakana   pts/0        110.50.148.40    Sat Feb 24 12:13   still logged in   
sakana   pts/0        110.50.148.40    Sat Feb 24 11:18 - 11:33  (00:15)    
reboot   system boot  4.4.104-39-defau Sat Feb 24 08:48 - 12:23  (03:34)  

接下來試試看 ac 指令

# ac
total        0.47

這個時候出現 0.47 ( 單位是上面的 in hours, 也就是 0.47 小時 )

以每日為單位的方式來統計
# ac   -d
Today total        0.50

以人為單位來統計

# ac   -p
sakana                               0.54
ines                                 0.00
total        0.54

指定某個使用者來統計

# ac  -p   sakana
sakana                               0.56
total        0.56

接下來測試 sa 指令

網路上找的 man page

# sa  --help

               Usage: sa [ options ] [ file ]
               
               options: [-abcdfiljkmnprstuDKP] [-v <num>] [--version] [--help]
               [--other-acct-file <name>] [--other-usracct-file <name>]
               [--print-seconds] [--dont-read-summary-files] [--debug]
                [--separate-times] [--other-savacct-file <name>] [--percentages]
                [--print-ratio] [--print-users] [--merge] [--user-summary] [--group-summary]
               [--list-all-names] [--not-interactive] [--threshold <num>]
                [--sort-ksec] [--sort-tio] [--sort-sys-user-div-calls] [--sort-avio]
                [--sort-cpu-avmem] [--sort-num-calls] [--sort-real-time] [--ahz hz]
      [--show-paging] [--show-paging-avg]

The system's default process accounting files are:

 raw process accounting data: /var/log/account/pacct
     summary by command name: /var/log/account/savacct
         summary by username: /var/log/account/usracct

這個指令比較有感覺的是 -m 選項
  • -m, --user-summary
    • Print the number of processes and number of CPU minutes on a per-user basis.

# sa  -m
                                    2542     707.54re       0.06cp         0avio      3570k
root                                 2411     544.83re       0.06cp         0avio      3412k
sakana                                 44      61.46re       0.00cp         0avio      4106k
sshd                                   43       2.17re       0.00cp         0avio     11906k
ines                                   43       0.00re       0.00cp         0avio      3388k
postfix                                 1      99.07re       0.00cp         0avio      9006k

還有 -c 選項, 使用百分比方式來顯示, 比較好即時判斷哪些指令使用較多的 cpu time
  • -c, --percentages
    • Print percentages of total time for the command's user, system, and real time values.

# sa  -c
   3055  100.00%     757.85re  100.00%       0.10cp  100.00%         0avio      3604k
   2170   71.03%       0.40re    0.05%       0.04cp   44.02%         0avio      3234k   iptables
     38    1.24%       0.26re    0.03%       0.02cp   18.02%         0avio      4176k   find
      8    0.26%      15.40re    2.03%       0.01cp    8.15%         0avio      9132k   systemd
      5    0.16%       2.16re    0.29%       0.01cp    6.24%         0avio      5964k   man

先說一下 sa 指令對自己的感覺
  • 可以使用 sa -m 來找出登入使用者真的有在操作指令的人
    • 同樣是登入系統, 使用 ac  -p 時間會累積統計, 但是如果這個使用者只是登入系統, 但是沒有操作指令, 他在  sa  -m 上面的 real time 會是 0.00  re
    • 換言之, 如果  sa  -m  發現 有某個使用 real time 一直上升,  可以判斷持續在執行某些動作
  • sa  -c 來找出耗費 cpu time 比較多的指令

最後來測試 lastcomm 指令

網路上找的 man page

# lastcomm  --help
Usage: lastcomm [-hpV] [-f file] [command] ... [user] ... [terminal] ...
      [--forwards] [--file <file>] [--strict-match] [--print-controls]
      [--user <name>] [--tty <name>] [--command <name>] [--debug]
      [--show-paging] [--version] [--help]

The system's default process accounting file is /var/log/account/pacct.

lastcomm 這個指令我倒是覺得還好
比較有感覺的應該是 後面加上指令名稱, 觀察哪些使用者有使用, 以及時間

# lastcomm  ls
ls                     root     pts/0      0.00 secs Sat Feb 24 13:09
ls                     root     pts/0      0.00 secs Sat Feb 24 13:09
ls                     root     pts/0      0.00 secs Sat Feb 24 13:08
ls                     max      pts/2      0.00 secs Sat Feb 24 12:49
ls                     max      pts/2      0.00 secs Sat Feb 24 12:49
ls                     max      pts/2      0.00 secs Sat Feb 24 12:49
ls                     ines     pts/1      0.00 secs Sat Feb 24 12:47

今天就先這樣了
~ enjoy it

Reference

Docker 讀書心得小記 ARG 與 ENV

Docker 讀書心得小記 ARG 與 ENV


2018 年的讀書會又開始啟動了
這次的用書是 Mastering Docker - 2nd edition


上次的讀書會內, 大家有討論到在 Dockerfile 內 ENV 以及 ARG
為了避免自己忘記就來寫一下心得 :)


先來觀察原來書中的範例 Dockerfile


# cat    Dockerfile


FROM alpine:latest
LABEL maintainer="Russ McKendrick <russ@mckendrick.io>"
LABEL description="This example Dockerfile installs Apache & PHP."
ENV PHPVERSION 7


RUN apk add --update apache2 php${PHPVERSION}-apache2 php${PHPVERSION} && \
       rm -rf /var/cache/apk/* && \
       mkdir /run/apache2/ && \
       rm -rf /var/www/localhost/htdocs/index.html && \
       echo "<?php phpinfo(); ?>" > /var/www/localhost/htdocs/index.php && \
       chmod 755 /var/www/localhost/htdocs/index.php


EXPOSE 80/tcp


ENTRYPOINT ["httpd"]
CMD ["-D", "FOREGROUND"]


這邊使用 ENV 的方式指定變數 PHPVERSION 為 7
在Dockerfile 新增套件的時候增加 php7-apache2 ( php${PHPVERSION}-apache2 )與 php7 (php${PHPVERSION}) 套件到系統內, 所以 docker images 建立起來的時候就是使用 php7
所以在執行 docker build 的時候, 建立 image 內 php 版本為 php7
# docker  build  --tag  local/apache-php:7   .


然後再次編輯 Dockerfile, 將 PHPVERSION 變數的值改為 5


FROM alpine:latest
LABEL maintainer="Russ McKendrick <russ@mckendrick.io>"
LABEL description="This example Dockerfile installs Apache & PHP."
ENV PHPVERSION 5


RUN apk add --update apache2 php${PHPVERSION}-apache2 php${PHPVERSION} && \
       rm -rf /var/cache/apk/* && \
       mkdir /run/apache2/ && \
       rm -rf /var/www/localhost/htdocs/index.html && \
       echo "<?php phpinfo(); ?>" > /var/www/localhost/htdocs/index.php && \
       chmod 755 /var/www/localhost/htdocs/index.php


EXPOSE 80/tcp


ENTRYPOINT ["httpd"]
CMD ["-D", "FOREGROUND"]


所以在執行 docker build 的時候, 建立 image 內 php 版本為 php5
# docker  build  --tag  local/apache-php:5   .


這樣的方式是不錯, 可是個人而言就會覺得好像太麻煩, 或是彈性太小
  • 需要去編輯 Dockfile
  • 不能在 docker build 的時候從指令上面指定嗎?


所以就在網路上面找到  ARG 的方式
  • ARG 可以在 docker build 的時候藉由 --build-arg 指定


所以就來進行實驗吧


Lab 1: 使用 ARG, 但是沒有給初始值


# cat   Dockerfile


FROM alpine:latest
LABEL maintainer="Russ McKendrick <russ@mckendrick.io>"
LABEL description="This example Dockerfile installs Apache & PHP."
#ENV PHPVERSION 7
ARG PHPVERSION


RUN apk add --update apache2 php${PHPVERSION}-apache2 php${PHPVERSION} && \
       rm -rf /var/cache/apk/* && \
       mkdir /run/apache2/ && \
       rm -rf /var/www/localhost/htdocs/index.html && \
       echo "<?php phpinfo(); ?>" > /var/www/localhost/htdocs/index.php && \
       chmod 755 /var/www/localhost/htdocs/index.php


EXPOSE 80/tcp


ENTRYPOINT ["httpd"]
CMD ["-D", "FOREGROUND"]


來進行 docker build 測試, 因為沒有指定 PHPVERSION 的值, ARG 也沒有給預設值, 所以在新增套件的時候會失敗


# docker  build --tag  local/apache-php:argtest  .


Sending build context to Docker daemon   2.56kB
Step 1/8 : FROM alpine:latest
latest: Pulling from library/alpine
Digest: sha256:7df6db5aa61ae9480f52f0b3a06a140ab98d427f86d8d5de0bedab9b8df6b1c0
Status: Downloaded newer image for alpine:latest
---> 3fd9065eaf02
Step 2/8 : LABEL maintainer "Russ McKendrick <russ@mckendrick.io>"
---> Using cache
---> b91a98043232
Step 3/8 : LABEL description "This example Dockerfile installs Apache & PHP."
---> Running in db14ad6c1ad9
---> c195f953eabb
Removing intermediate container db14ad6c1ad9
Step 4/8 : ARG PHPVERSION
---> Running in 6e30a023e3b1
---> d503211faf4f
Removing intermediate container 6e30a023e3b1
Step 5/8 : RUN apk add --update apache2 php${PHPVERSION}-apache2 php${PHPVERSION} &&         rm -rf /var/cache/apk/* &&         mkdir /run/apache2/ &&         rm -rf /var/www/localhost/htdocs/index.html &&         echo "<?php phpinfo(); ?>" > /var/www/localhost/htdocs/index.php &&         chmod 755 /var/www/localhost/htdocs/index.php
---> Running in 31ce8064f962
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
ERROR: unsatisfiable constraints:

接下來使用 --build-arg 的方式在 docker build 中指定 PHPVERSION 為 7


# docker  build  --build-arg  PHPVERSION=7  --tag  local/apache-php:argtest7  .


這樣編譯就沒有問題, 接下來驗證一下 PHP 是否為 7 的版本, 啟動 local/apache-php:argtest7 來檢查吧


# docker   run  -d  -p  80:80  local/apache-php:argtest7
a34e911c75bb54fcbdc3958be835bb93e0e87288efd6751c79b944a52abb91ba


開啟瀏覽器, 觀察 http://localhost




再來實驗 --build-arg 將 PHPVERSION 指定為 5 建立 image


# docker  build  --build-arg  PHPVERSION=5  --tag  local/apache-php:argtest5  .


用同樣的方式在 port 81 啟動 local/apche-php:argtest5


# docker   run   -d   -p  81:80   local/apache-php:argtest5
dd75d69b2953243a8a6bbf166385e479a22e4dfd31eee37d1f35facd924975df


開啟瀏覽器, 觀察 http://localhost:81




果然是我們要的 PHP 5

Lab 2: 使用 ARG, 有給初始值


跟上個練習很像, 只是這次的 Dockerfile 內的 ARG 有給初始值


# cat   Dockerfile


FROM alpine:latest
LABEL maintainer="Russ McKendrick <russ@mckendrick.io>"
LABEL description="This example Dockerfile installs Apache & PHP."
#ENV PHPVERSION 7
ARG PHPVERSION=7


RUN apk add --update apache2 php${PHPVERSION}-apache2 php${PHPVERSION} && \
       rm -rf /var/cache/apk/* && \
       mkdir /run/apache2/ && \
       rm -rf /var/www/localhost/htdocs/index.html && \
       echo "<?php phpinfo(); ?>" > /var/www/localhost/htdocs/index.php && \
       chmod 755 /var/www/localhost/htdocs/index.php


EXPOSE 80/tcp


ENTRYPOINT ["httpd"]
CMD ["-D", "FOREGROUND"]


來嘗試剛剛的 docker build 吧 :)


# docker  build  --tag  local/apache-php:argdefault  .


因為有給預設值, 所以就算沒有透過 --build-arg 指定, 他會使用預設值來建立, 所以就沒有問題


接下來實驗 --build-arg 指定一個值, 但是跟預設值不同


# docker  build --build-arg  PHPVERSION=5 --tag  local/apache-php:argover5 .


是的, 這樣的方式, 指定的 PHPVERSION=5 會覆蓋掉預設值的 PHPVERSION=7 :)
達成彈性的目的


Lab 3:  ARG 與 ENV 優先性


其實我也覺得我自己的問題很多 :p
不得不說讀書會的好處就是, 可以討論很多自己不會去想的問題
讀書會有人提出, 那 ARG 與 ENV 都存在的時候, 以誰為準 ???


修改剛剛的 Dockfile, 故意讓同一個變數分別被 ENV 與 ARG 指定


# cat  Dockerfile


FROM alpine:latest
LABEL maintainer="Russ McKendrick <russ@mckendrick.io>"
LABEL description="This example Dockerfile installs Apache & PHP."
ENV PHPVERSION 5
ARG PHPVERSION=7


RUN apk add --update apache2 php${PHPVERSION}-apache2 php${PHPVERSION} && \
       rm -rf /var/cache/apk/* && \
       mkdir /run/apache2/ && \
       rm -rf /var/www/localhost/htdocs/index.html && \
       echo "<?php phpinfo(); ?>" > /var/www/localhost/htdocs/index.php && \
       chmod 755 /var/www/localhost/htdocs/index.php


EXPOSE 80/tcp


ENTRYPOINT ["httpd"]
CMD ["-D", "FOREGROUND"]


執行 docker build 測試
# docker  build  --tag  local/apache-php:argvsenv .


測試結果
安裝的是 PHP 5 , 也就是 ENV 指定的版本


為了排除是變數指定順序的問題 再次修改 Dockerfile


# cat  Dockerfile


FROM alpine:latest
LABEL maintainer="Russ McKendrick <russ@mckendrick.io>"
LABEL description="This example Dockerfile installs Apache & PHP."
ARG PHPVERSION=7
ENV PHPVERSION 5


RUN apk add --update apache2 php${PHPVERSION}-apache2 php${PHPVERSION} && \
       rm -rf /var/cache/apk/* && \
       mkdir /run/apache2/ && \
       rm -rf /var/www/localhost/htdocs/index.html && \
       echo "<?php phpinfo(); ?>" > /var/www/localhost/htdocs/index.php && \
       chmod 755 /var/www/localhost/htdocs/index.php


EXPOSE 80/tcp


ENTRYPOINT ["httpd"]
CMD ["-D", "FOREGROUND"]


測試結果
安裝的是 PHP 5 , 也就是 ENV 指定的版本
也就是跟 Dockerfile 內的順序無關, 排除 overwrite 考量

最後, 另外一個觀察點是變數有效範圍
  • ARG 的變數只在 build image 範圍內有效
  • ENV 是在 build image 以及之後執行 image 都有效


這一點可以藉由 docker inspect 來驗證


觀察剛剛由 ARG 建立的 image
# docker   inspect   -f   {{.Config.Env}}   local/apache-php:argtest5
[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]


觀察剛剛 ENV 擊敗 ARG 建立的 image
# docker   inspect  -f   {{.Config.Env}}   local/apache-php:argvsenv
[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PHPVERSION=5]

感謝讀書會讓我多會一些東西


Reference

~ enjoy it