📖

linux由来の本番・テスト環境を識別する

2021/09/12に公開

需要

webサービス等の制作する時、本番環境とテスト環境を判断して、動作を切り替えたい場合がある。

プログラミング言語によっては、標準APIがこれらを代替してるが(概ねOSの区別までは比較的容易)、linux系については代表的な方法がある。

GAE/GCP Python dev_appserver or cloud

これは小生の独自調査による。サーバサイドの環境変数をダンプして両者を突き合わせた。どうやら GAE_ENV がそうらしいとわかる。

変数名 dev_app クラウド
PYTHONHASHSEED random None
PYTHONCOERCECLOCALE 0 None
GAE_ENV locald_ev standard
GAE_VERSION 20201006t022402 2
PYTHONUNBUFFERED None 1
PYTHONDONTWRITEBYTECODE None 1
DEBIAN_FRONTEND None noninteractive

GAE_VERSIONの内容がまるで違うのも気にはなる。

なおこの調査は2020年下旬に行っている。最新版では挙動が違う可能性がある。

docker内外

概ねoverlayfsをチェックすれば識別できるとは思われるが、procfsを見るのが無難なようだ。

shell - How to check if a process is running inside docker container - Stack Overflow

$ cat /proc/self/cgroup

9:hugetlb:/
8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/
$ cat /proc/1/cgroup

8:perf_event:/
7:blkio:/
6:freezer:/
5:devices:/
4:memory:/
3:cpuacct:/
2:cpu:/docker/25ef774c390558ad8c4e9a8590b6a1956231aae404d6a7aba4dde320ff569b8b
1:cpuset:/

ちなみに小生のarchlinuxホストOSだとこうなる

$ cat /proc/1/cgroup 
12:devices:/init.scope
11:pids:/init.scope
10:freezer:/
9:rdma:/
8:blkio:/init.scope
7:cpuset:/
6:hugetlb:/
5:perf_event:/
4:net_cls,net_prio:/
3:cpu,cpuacct:/init.scope
2:memory:/init.scope
1:name=systemd:/init.scope
0::/init.scope

linuxディストリビューション

/etc/os-release ファイルが共通規格であり、これを観るのが確実なようだ。

構文は、シェルスクリプトの変数定義に酷似しており、bash等で読み込むのに都合が良い。

How to check os version in Linux command line - nixCraft

ubuntu|debianでの例

$ more /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

manjaro/archlinxでの例

$ cat /etc/os-release 
NAME="Manjaro Linux"
ID=manjaro
ID_LIKE=arch
BUILD_ID=rolling
PRETTY_NAME="Manjaro Linux"
ANSI_COLOR="32;1;24;144;200"
HOME_URL="https://manjaro.org/"
DOCUMENTATION_URL="https://wiki.manjaro.org/"
SUPPORT_URL="https://manjaro.org/"
BUG_REPORT_URL="https://bugs.manjaro.org/"

https://www.freedesktop.org/software/systemd/man/os-release.html

NAME=
VERSION=
ID=
ID_LIKE=
VERSION_CODENAME=
VERSION_ID=
PRETTY_NAME=
ANSI_COLOR=
CPE_NAME=
HOME_URL=, DOCUMENTATION_URL=, SUPPORT_URL=, BUG_REPORT_URL=, PRIVACY_POLICY_URL=
BUILD_ID=
VARIANT=
VARIANT_ID=
LOGO=

Discussion