web-dev-qa-db-ja.com

postfixが実行されているかどうかをテストする

postfixがbashスクリプト内から実行されているかどうかをテストするための信頼できる方法を探しています。

私の最初の試みは単にpidof postfixを試すことでしたが、うまくいきませんでした。

次に、postfix statusを取得しようとしました:

POSTFIX_LOCATION=/var/packages/MailServer/target/sbin/postfix # location of postfix
result=`$POSTFIX_LOCATION status`
if [ -z $result ]; then
    echo "Error: No status output from postfix"
Elif [[ "$result" == *"is running"* ]]; then
    echo "postfix is running!"
else echo "postfix is not running!"
fi

ただし、ステータスがコンソールに報告されても、result変数は空のままです。これはコンソール出力です:

postfix/postfix-script: the Postfix mail system is running: PID: 11996
Error: No status output from postfix

「マスター」であるPID: 11996のプロセス名を取得することで、Postfixが実行されているかどうかをテストする方法をようやく見つけました。したがって、次のdoesは機能します。

pidof master

しかし、これはそれほど冗長ではなく、postfixが実行されているかどうかをテストするための信頼できる方法であるかどうかはわかりません。

だから私の質問は:

  • postfix statusの出力をbashスクリプト内から取得するにはどうすればよいですか? -私がそこで間違っていることはありますか?
  • postfixがbashスクリプト内から実行されているかどうかをテストするためのより良いreliable方法はありますか?
8
Balder

DebianまたはUbuntu

Sudo service postfix status
9
Javo Troya

Postfixが実行されているかどうかを確認するには:

Sudo /etc/init.d/postfix status

Postfixを開始するには:

Sudo /etc/init.d/postfix start

Postfixを停止するには:

Sudo /etc/init.d/postfix stop
4
Sandesh

Postfixが実行されているかどうかをテストする信頼できる方法:

if /var/packages/MailServer/target/sbin/postfix status; then
    echo "postfix is running!"
else echo "postfix is not running!"
fi

基本的に同じことをする代替:

if /var/packages/MailServer/target/libexec/master -t 2>/dev/null; then
    echo "postfix is not running!"
else echo "postfix is running!"
fi

推論

さらに調査を行ったところ、Postfixが実行されているかどうかを確認するためのps | grep [p]ostfixのテストはまったく信頼できないことがわかりました。

postfixが内部のpostlogバイナリを出力に使用するため、/var/packages/MailServer/target/sbin/postfix statusが有用なものを出力しない理由はこれです。関連するコードはbashスクリプト/var/packages/MailServer/target/libexec/postfix-scriptにあります:

LOGGER="$command_directory/postlog -t $MAIL_LOGTAG/postfix-script"
INFO="$LOGGER -p info"

一方、postfix status終了コードのチェックは正常に機能します。 postfix-scriptは、実際にはpostfixバイナリによってバックグラウンドで呼び出され、直接呼び出すことはできません。ただし、幸運なことに、スクリプトにはpostfixが実行されているかどうかをテストするコードも含まれています。

status)
    $daemon_directory/master -t 2>/dev/null && {
        $INFO the Postfix mail system is not running
        exit 1
    }
    $INFO the Postfix mail system is running: PID: `sed 1q pid/master.pid`
    exit 0
    ;;

変数$daemon_directoryは、呼び出し元のpostfixバイナリによって設定されます。私のシステムでは/var/packages/MailServer/target/libexec/に解決されます。

1
Balder