测试 postfix 是否正在运行

测试 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我终于找到了一种通过获取进程名称(“master”)来测试 postfix 是否正在运行的方法。所以下面的工作:

pidof master

但这不是很详细,我不确定这是否是测试是否postfix正在运行的可靠方法。

所以我的问题是:

  • postfix status如何从 bash 脚本内部获取输出? - 我有什么做错的地方吗?
  • 有没有更好的可靠的测试是否postfix从 bash 脚本内部运行的方法?

答案1

Debian 或 Ubuntu

sudo service postfix status

答案2

测试 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

推理

经过更多研究后,发现测试 forps | grep [p]ostfix来验证 postfix 是否正在运行根本不可靠。

/var/packages/MailServer/target/sbin/postfix status似乎没有输出任何有用的东西的原因是,因为postfix使用内部postlog二进制文件进行输出。相关代码可以在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/.

答案3

检查 Postfix 是否正在运行:

sudo /etc/init.d/postfix status

启动后缀:

sudo /etc/init.d/postfix start

要停止后缀:

sudo /etc/init.d/postfix stop

答案4

我在一个非常精简的 docker 容器内运行 postfix,并且安装了很少的正常命令。但它确实有 netstat。因此,使用 netstat 列出进程正在侦听的端口。查找监听 smtp 端口的进程(例如 postfix)。

if ! netstat -l | grep smtp; then
    echo "postfix is not running!"
else echo "postfix is running!"
fi

相关内容