我正在寻找一种可靠的方法来测试是否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