OSで実行できるコマンドが、UserParameterでエラーとなる原因と対処法について

いつもお世話になっております。
タイトルの件について質問させて頂きます。

使用環境
Zabbix Server:3.0.7 PostgreSQL
OS:CentOS 7.2

Zabbix Agent:3.0.7
OS:CentOS 7.3

UserParameterを使用してFPGAカードの状態を確認するコマンド
"bwmonitor --dev=1 --read | grep "Board Power" | grep OK | wc -l"
を実行して"OK"の数が"0"の場合にエラー検知するよう設定しています。

OSで上記コマンドを実行すると結果を正しく返してくれるのですが、
zabbixのwebコンソール、zabbix_getで値を取得すると"0"が返ってきます。
下記ページを参考に切り訳を行いました。

http://www.zabbix.jp/node/2727

AllowRootは"1”設定しているため、コマンドはrootで実行されている認識です。
DebugLevelを"4"に変更してログを確認しましたが、下記の通り出力されており
正常に実行できているように見えます。

------------------------------------------------------------------------------------------------------------------------
14164:20171115:110142.669 Requested [fpga.status1]
14164:20171115:110142.669 In zbx_popen() command:'bwmonitor --dev=0 --read | grep "Board Power" | grep OK | wc -l'
14164:20171115:110142.670 End of zbx_popen():7
14399:20171115:110142.670 zbx_popen(): executing script
14164:20171115:110142.678 In zbx_waitpid()
14164:20171115:110142.678 zbx_waitpid() exited, status:0
14164:20171115:110142.678 End of zbx_waitpid():14399
------------------------------------------------------------------------------------------------------------------------

SELinuxはDisableに設定しています。

grepを1つずつ消して実行し結果的に
"'bwmonitor --dev=0 --read"コマンドでエラーとなっており、
状態取得ができていないことがわかりました。

OSで実行できるコマンドが、UserParameterでエラーとなるのは何故でしょうか。
原因と対処方法についてご教示いただきますようお願い致します。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー heya の写真

>"'bwmonitor --dev=0 --read"コマンドでエラーとなっており、
このエラーの内容が分かるといいのですが・・・。

一つの可能性として、パスが通ってないことが考えられます。
root の PATH 環境変数はどうなってますか?bwmonitor のパスは通っていますか?
sudo の設定によっては、sudo で root になった場合に sudo 前の環境を引き継ぐこともある(※)ので、 sudo -i や su - で root になってから bwmonitor が実行できるかも確認してみてください。
それか、フルパスで指定するというのも一つの手です。

※つまり、手動でのテストのときに、sudo 前のユーザーの PATH を引き継いでいて、root ユーザーの PATH とは違っている可能性がある。

ユーザー dondoc の写真

返信頂きありがとうございます。

UserParameterに実行コマンドをフルパスで指定しましたが、結果変わりませんでした。
該当サーバにsu - でrootユーザにチェンジし、フルパスではなく実行すると意図した結果が出力されます。
よってrootユーザでもパスは通っておりました。
念のため、UserParameterで実行するユーザを確認するため、UserParameterでwhoamiを
実行したところrootと返ってきています。

他に考えられることはございますでしょうか。

2017/11/15 20:35 追記します。
>"'bwmonitor --dev=0 --read"コマンドでエラーとなっており、

UserParameterに"bwmonitor --dev=0 --read"を指定し、Zabbix Serverから
zabbix_getで当該サーバのユーザパラメータに対して実行したところ、

ERROR: could not initialize Host Interface Library

上記メッセージが出力されました。
合わせてご確認頂ければと思います。

ユーザー heya の写真

それでは、PATH はいいとして、それ以外の環境変数は、root (でログイン時=su -)のものとテストで成功したときのものとで、全く同じですか?
bwmonitor は知らないのですが、例えば java(に限りませんが)では LD_LIBRARY_PATH 環境変数が必要になったりするので、同じような感じで bwmonitor に必要な環境変数があるのなら、それが設定されているかどうか確認してみるといいと思います。
※bwmonitor のマニュアルがあるなら、そちらも確認してみてください。

あと、初歩的な話ですが、
>SELinuxはDisableに設定しています。
これは、getenforce コマンドで disabled と出てくるところまで確認していますか?
(/etc/sysconfig/selinux の SELINUX を disabled に変更した後、再起動してあるか?の確認)

ユーザー dondoc の写真

>それでは、PATH はいいとして、それ以外の環境変数は、root (でログイン時=su -)のものとテストで成功したときのものとで、全く同じですか?
テストで成功したものと同じと確認するためには、UserParameterでパスを表示させて確認で宜しいでしょうか?

>これは、getenforce コマンドで disabled と出てくるところまで確認していますか?
はい、getenforceコマンドでdisabledと出力されることを確認しています。

ユーザー heya の写真

>テストで成功したものと同じと確認するためには、UserParameterでパスを表示させて確認で宜しいでしょうか?

パスというか、printenv ですね。

ユーザー kng の写真

こんにちは。

さらっとソースをながめてみましたが、該当のエラー出力は、bwmonitorが出力している物のようです。

zbx_popenは、execlしているだけみたいですので、パラメータがうまく渡せていないのだと思います。

スクリプトに書いて、結果をechoする対応でご希望の監視はできるかと思いますが、いかがでしょうか?

(手間ですが。。。)

ユーザー fripper の写真

shared library (*.so) の読み込みに失敗しているのかもしれません
(Windows で言うところの DLL みたいなもの)

まず、当該コマンドを実行できる環境下で、ldd コマンドを実行してみると、
どのパスのどのファイルをリンクしているかわかるはずです
例:

[root@server: ~(1)]# ldd /opt/pgsql/bin/psql
linux-vdso.so.1 => (0x00007ffd2438b000)
libpq.so.5 => /opt/pgsql/lib/libpq.so.5 (0x00007f78defb5000)
libreadline.so.6 => /lib64/libreadline.so.6 (0x00007f78ded68000)
libc.so.6 => /lib64/libc.so.6 (0x00007f78de9d4000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f78de7b7000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f78de595000)
/lib64/ld-linux-x86-64.so.2 (0x00007f78df1dc000)
[root@server: ~(2)]#

必要となる .so ファイルのパスを確認したうえで、
「LD_LIBRARY_PATH」環境変数に、以下のような書式で、当該パスを追加すれば
実行できるようになるかもしれません

export LD_LIBRARY_PATH=/opt/pgsql/lib:${LD_LIBRARY_PATH}

UserParameter の実行コマンドとして、

LD_LIBRARY_PATH=/opt/pgsql/lib:${LD_LIBRARY_PATH}; command

と言うかたちで、セミコロン区切りで書く方法か、もしくは
zabbix_agentd を起動しているスクリプト
(/etc/init.d 以下や、systemctl から実行されるサービス起動用のスクリプト等)
に書き足す方法で、ロード用のパスに追加されて実行できるようになるかもしれません

ユーザー dondoc の写真

>heyaさん

UserParamterでprintenvした結果と、対象サーバ上でsu -でrootユーザにスイッチしprintenvの
結果を比較したところ環境変数に差異がありました。
UserParameterでコマンド実行する際は、まずrootユーザ以外でログインし
接続後rootユーザに環境変数を引き継ぎスイッチしているように見えます。
※上記の認識が違っていればご指摘願います。

UserParameterで実行する際はまずどのユーザでログインし、rootにスイッチしているのでしょうか?

>kngさん

シェルで実行して、その結果をテキストに出力してそのファイルを監視するで対応できそうですよね。
UserParameterで実施できない場合の、最終手段として覚えておきます。。

>fripper さん
lddコマンドで実行ファイルが格納されているパスを指定し、実行しました。
/lib64配下に.soファイルが存在しているので、/lib64をLD_LIBRARY_PATHに追記しました。
heyaさんの所にも記載したのですが、対象サーバ上でのrootユーザの環境変数と
UserParameterでのrootユーザの環境変数が異なっているので、まずはそこを合わせたほうがよいですかね。。

ユーザー TNK の写真

AllowRootを有効にして、zabbix_agentdをrootで起動しているので
あれば、rootユーザーのままで実行されます。
他のユーザにスイッチしてということはありません。

注意しなければならないのは、zabbix_agentdからUserParameterの
処理を呼び出すときには、ログインシェルが起動されるわけではな
いので、ログインシェルが読み込むようなスクリプトは読み込まれ
なかったはずです。(/etc/profileなど)

コマンドを実行するのに特殊な環境変数の設定が必要であるならば、
UserParameterからスクリプトを呼び出すようにして、そのスクリ
プト内で指定するなど、明示的に指定するようにしてみてください。

ユーザー dondoc の写真

TNKさん

ご回答いただきありがとうございます。

ご回答いただきましたような、ログイン時に読み込むファイルを読み込むよう設定をし、
実行しましたが、うまく実行できませんでした。

しかし、環境変数HOME=/rootを設定したら実行できるようになりました。
なぜ本設定をいれたら実行できるようになったかは不明です。

【設定内容】
UserParameter=アイテムキー,export HOME=/root;bwmonitor --dev=0 --read | grep "Board Power" | grep OK | wc -l

なぜ、本設定で実行できるようになるのかわかれば、教えていただけましたら幸いです。

以上、よろしくお願いいたします。

ユーザー TNK の写真

ご回答いただきましたような、ログイン時に読み込むファイルを読み込むよう設定をし、
実行しましたが、うまく実行できませんでした。

上にも書いたとおり、ログイン時に読み込まれるファイルに設定し
たのでは読み込まれません。

ログイン時に読み込まれるファイルではなく、シェル自体が読み込
むファイルが、明示的にHOMEを指定したことで、たまたま読み込ま
れるようになったのだと思います。

ユーザー dondoc の写真

みなさま

ご協力いただきありがとうございました。

たまたまですが、UserParameterを実行することができたため、
本件は解決としたいと思います。

また、TNK様からご回答いただいた内容は、まだ理解できておりませんが、
Zabbix、OSの動作を勉強し、理解したいと思います。

以上、ありがとうございました。