実は以前調べたことがあり、間違って System.getenv("HOSTNAME") を使ってしまった。
Facebookで他のエンジニアがLinux前提で /proc/sys/kernel/hostname を読み込む方法使ってたのを見かけ、HOSTNAMEを使う方法を教えたらうまく動かず、今回改めて調べ直したら見事にHOSTNAME使うのはbash依存ということが判明orz.
"InetAddress.getLocalHost().getHostName()"はマシンのネットワーク設定, DNS等によっては失敗したり、期待したものとは異なるものが返ってくる可能性がある。
System.getenv("HOSTNAME") はNGだった。というのは、"HOSTNAME"は厳密にはbashが設定する「変数」であり、「環境変数」ではない。そのため、bash系の設定ファイルによっては、HOSTNAMEが環境変数としてexportされずに、取得できないケースがある。
参考:
unixであれば Runtime.getRuntime().exec("hostname") が無難。これはネットワーク設定ではなくkernelレベルで設定されたマシン名を返す。
Linuxの場合なら、 /proc/sys/kernel/hostname をJavaで直接読み込んでも良い。hostnameコマンドも結局このファイルを読み書きしてるだけ。
参考:
Windowsの場合は、System.getenv("COMPUTERNAME") が使えるらしいが、厳密な調査は出来てない。
コメント