2 台の Ubuntu 64 ビット サーバーで ZABBIX エージェント (C で記述) をセットアップしています。特に64ビットが必要でない限り(データベースサーバーなど)、通常はすべて32ビットでコンパイルします。問題のサーバーは仮想サーバーをホストし、8GBのRAMを搭載するため、64ビットのままにしています。
ZABBIX エージェントが root として起動する場合、C の getpwnam() 関数を使用してルックアップする zabbix ユーザーのアクセス許可レベルにドロップダウンしようとします。
純粋な 32 ビット システムでは、この関数は動作します。ただし、64 ビット システムで 32 ビットでコンパイルされた場合、ユーザーが存在する場合、getpwnam() は NULL を返します。64 ビット システムで 64 ビットでコンパイルすると、問題なく動作します。
これを証明する小さなアプリケーションをモックアップしましたが、GCC や STL のバグというよりも、私のセットアップに問題があることを願っています。zabbix ユーザーは LDAP ディレクトリにいます。
まず、このプログラムの出力は次のとおりです。
root@sydney:/tmp# getent passwd|grep zabbix
zabbix:x:1500:1500:Zabbix Service:/home/zabbix:/bin/bash
root@sydney:/tmp# gcc main.c
root@sydney:/tmp# ./a.out
User zabbix exists with UID 1500.
root@sydney:/tmp# gcc -m32 main.c
root@sydney:/tmp# ./a.out
User zabbix does not exist.
以下は、ZABBIX エージェントのソース コードを使用して適応させた小さなプログラムのコードです。
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
int main(int num_args, char** args)
{
struct passwd *pwd;
char user[7] = "zabbix";
pwd = getpwnam(user);
if (NULL == pwd)
{
fprintf(stdout, "User %s does not exist.\r\n", user);
return 1;
}
else
{
fprintf(stdout, "User %s exists with UID %d.\r\n", user, pwd->pw_uid);
}
return 0;
}
これが私のセットアップの問題であることが判明した場合は、serverfault.com で喜んで質問しますが、getpwnam() 関数を中心にしているため、プログラミングに関連していると思いました。私もグーグルで調べましたが、役に立つものは何も見つかりませんでした。そのため、それが私の設定だと思う傾向があります。