#!/bin/bash
service_name="my_service"
log_file="/var/log/$service_name-monitor.log"
start_command="systemctl start $service_name"
# 检查服务状态
status=$(systemctl is-active $service_name 2>&1)
if [ "$status" != "active" ]; then
echo "$(date): $service_name 未运行,尝试启动..." | tee -a $log_file
$start_command 2>&1 | tee -a $log_file
new_status=$(systemctl is-active $service_name 2>&1)
if [ "$new_status" != "active" ]; then
error_msg=$(cat $log_file | tail -n 1)
echo "$(date): 启动 $service_name 失败,错误信息: $error_msg" | tee -a $log_file
echo "$error_msg" | sendmail -s '服务启动失败' admin@example.com
else
echo "$(date): $service_name 启动成功" | tee -a $log_file
fi
else
echo "$(date): $service_name 正在运行" | tee -a $log_file
fi
故障排查
- 脚本逻辑方面:
- 语法检查:使用
bash -n
命令对脚本进行语法检查,确保脚本没有语法错误。例如bash -n your_script.sh
。
- 变量检查:确认脚本中使用的变量(如
service_name
、log_file
、start_command
)设置正确,特别是service_name
要与实际服务名匹配,log_file
路径要有写入权限。
- 命令检查:检查脚本中调用的命令(如
systemctl
、sendmail
)是否正确,参数是否匹配。可以单独在命令行中执行这些命令,确保其能正常工作。例如,先执行systemctl start my_service
看能否正常启动服务,执行sendmail -s '测试' admin@example.com
看邮件能否正常发送。
- 错误处理检查:检查脚本中的错误处理逻辑是否正确,例如启动失败后记录错误信息和发送邮件的逻辑是否按照预期执行。可以通过模拟服务启动失败的情况来验证这部分逻辑。
- 系统环境方面:
- 权限检查:确认执行脚本的用户有足够的权限来操作服务(如启动、查看状态)和写入日志文件。例如,使用
systemctl
命令操作服务通常需要root权限,所以脚本可能需要以root身份运行。可以通过sudo -u your_user bash -c 'your_script.sh'
来测试不同用户运行脚本的情况。
- 服务依赖检查:确认服务
my_service
所依赖的其他服务或资源都已正确安装和运行。例如,如果my_service
依赖于数据库,确保数据库服务正在运行。可以通过检查相关服务的状态来排查。
- 日志检查:除了脚本自身记录的日志,还可以查看系统相关日志(如
/var/log/syslog
、/var/log/messages
等),看是否有与服务启动或脚本执行相关的错误信息。这些日志可能会提供更详细的系统层面的错误原因。
- 网络检查:如果脚本涉及到邮件发送,确保网络连接正常,DNS配置正确,邮件服务器可达。可以通过
ping
邮件服务器地址和nslookup
域名来检查网络和DNS。