コマンドの実行
Zabbixでは、外部チェック、ユーザーパラメータ、system.runアイテム、カスタムアラートスクリプト、リモートコマンド、グローバルスクリプトに共通の機能を使用します。
すべてのコマンドとスクリプトは、Zabbixエージェントを実行しているOSユーザーの権限で実行されます。 ユーザーには、コマンドまたはスクリプトを実行するための十分な権限が必要です。
実行手順
デフォルトでは、Zabbixのすべてのスクリプトは sh シェルを使用して実行され、デフォルトのシェルを変更することはできません。 別のシェルを使用するには、回避策としてスクリプトファイルを作成し、コマンドの実行時にそのスクリプトを呼び出します。
コマンドまたはスクリプトは、UnixプラットフォームとWindowsプラットフォームの両方で、同様の手順で実行されます。
- Zabbix(親プロセス)は、通信のためのパイプを作成します。
- Zabbixは、作成する子プロセスの出力先としてパイプを設定します。
- Zabbixは、子プロセスを作成します(コマンドまたはスクリプトを実行します)。
- 子プロセス用に、新しいプロセスグループ(Unixの場合)またはジョブ(Windowsの場合)が作成されます。
- Zabbixは、タイムアウトが発生するか、もう一方の端で書き込みを行うプロセスがなくなるまで、パイプから読み取ります(すべてのハンドルまたはファイルディスクリプターが閉じられるまで)。 子プロセスは、さらにプロセスを作成し、それらのプロセスが終了するか、ハンドルまたはファイルディスクリプターを閉じる前に終了する可能性があることに注意してください。
- タイムアウトに達していない場合、Zabbixは最初の子プロセスが終了するか、タイムアウトが発生するまで待機します。
- 最初の子プロセスがタイムアウトに達する前に終了した場合、Zabbixは最初の子プロセスの終了コードを確認し、
0と比較します。 0以外の終了コードは実行失敗とみなされます。ただし、これはZabbixサーバーまたはZabbixプロキシで実行されるカスタムアラートスクリプト、リモートコマンド、およびユーザースクリプトの場合に限られます。 - この時点で処理がすべて完了したものとみなされ、プロセスツリー全体(つまり、プロセスグループまたはジョブ)が終了されます。
Zabbixは、最初の子プロセスが終了し、かつ他のプロセスが出力ハンドルまたはファイルディスクリプターを開いたままにしていない場合に、コマンドまたはスクリプトの処理が完了したとみなします。 処理が完了すると、作成されたすべてのプロセスが終了されます。
コマンド内のすべての二重引用符とバックスラッシュはバックスラッシュでエスケープされ、コマンド全体が二重引用符で囲まれます。
終了コードの確認
終了コードは、以下の条件で確認されます。
- ZabbixサーバーおよびZabbixプロキシで実行されるカスタムアラートスクリプト、リモートコマンド、ユーザースクリプトのみが対象です。
0以外の終了コードは、実行失敗とみなされます。- 実行に失敗した場合、標準エラーおよび標準出力の内容が収集され、Webインターフェースで確認できます(実行結果が表示される場所)。
- エージェント/プロキシで
LogRemoteCommandsパラメータを有効にすると、ZabbixエージェントまたはZabbixプロキシで実行されたリモートコマンドについて、追加のログエントリが作成される場合があります。
コマンドまたはスクリプトの実行に失敗した場合に表示されるWebインターフェースのメッセージおよびログエントリは、以下のとおりです。
- 実行に失敗した場合の標準エラーおよび標準出力の内容(存在する場合)。
Process exited with code: N.(出力が空で、終了コードが0ではない場合)。Process killed by signal: N.(プロセスがシグナルによって終了した場合。Linuxのみ)。Process terminated unexpectedly.(不明な理由でプロセスが終了した場合)。