#navi_header|Java| 実は以前調べたことがあり、間違って System.getenv("HOSTNAME") を使ってしまった。 Facebookで他のエンジニアがLinux前提で /proc/sys/kernel/hostname を読み込む方法使ってたのを見かけ、HOSTNAMEを使う方法を教えたらうまく動かず、今回改めて調べ直したら見事にHOSTNAME使うのはbash依存ということが判明orz. - Recommended way to get hostname in Java - Stack Overflow -- http://stackoverflow.com/questions/7348711/recommended-way-to-get-hostname-in-java "InetAddress.getLocalHost().getHostName()"はマシンのネットワーク設定, DNS等によっては失敗したり、期待したものとは異なるものが返ってくる可能性がある。 System.getenv("HOSTNAME") はNGだった。というのは、"HOSTNAME"は厳密にはbashが設定する「変数」であり、「環境変数」ではない。そのため、bash系の設定ファイルによっては、HOSTNAMEが環境変数としてexportされずに、取得できないケースがある。 参考: - shell - HOSTNAME environment variable on Linux - Super User -- http://superuser.com/questions/132489/hostname-environment-variable-on-linux - Internal Variables -- http://tldp.org/LDP/abs/html/internalvariables.html - unix - Usage of HOSTNAME and CURRENT_USER in scripts on linux - Server Fault -- http://serverfault.com/questions/80201/usage-of-hostname-and-current-user-in-scripts-on-linux - bash - HOSTNAME set in environment but not visible to gmake - Stack Overflow -- http://stackoverflow.com/questions/6353065/hostname-set-in-environment-but-not-visible-to-gmake unixであれば Runtime.getRuntime().exec("hostname") が無難。これはネットワーク設定ではなくkernelレベルで設定されたマシン名を返す。 Linuxの場合なら、 /proc/sys/kernel/hostname をJavaで直接読み込んでも良い。hostnameコマンドも結局このファイルを読み書きしてるだけ。 参考: - https://www.kernel.org/doc/Documentation/sysctl/kernel.txt - http://linuxjm.sourceforge.jp/html/LDP_man-pages/man5/proc.5.html Windowsの場合は、System.getenv("COMPUTERNAME") が使えるらしいが、厳密な調査は出来てない。 #navi_footer|Java|