MST
星途 面试题库

面试题:复杂Bash脚本逻辑与故障排查优化

写一个Bash脚本,用于监控某个特定服务(假设服务名为my_service)的运行状态。如果服务未运行,尝试启动它,并记录启动操作到日志文件。若启动失败,将详细的错误信息记录到日志文件,并通过邮件发送给管理员(假设邮件发送命令为sendmail -s '服务启动失败' admin@example.com)。阐述在脚本运行出现问题时,从脚本逻辑和系统环境两方面如何进行故障排查。
27.4万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试
#!/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

故障排查

  1. 脚本逻辑方面
    • 语法检查:使用bash -n命令对脚本进行语法检查,确保脚本没有语法错误。例如bash -n your_script.sh
    • 变量检查:确认脚本中使用的变量(如service_namelog_filestart_command)设置正确,特别是service_name要与实际服务名匹配,log_file路径要有写入权限。
    • 命令检查:检查脚本中调用的命令(如systemctlsendmail)是否正确,参数是否匹配。可以单独在命令行中执行这些命令,确保其能正常工作。例如,先执行systemctl start my_service看能否正常启动服务,执行sendmail -s '测试' admin@example.com看邮件能否正常发送。
    • 错误处理检查:检查脚本中的错误处理逻辑是否正确,例如启动失败后记录错误信息和发送邮件的逻辑是否按照预期执行。可以通过模拟服务启动失败的情况来验证这部分逻辑。
  2. 系统环境方面
    • 权限检查:确认执行脚本的用户有足够的权限来操作服务(如启动、查看状态)和写入日志文件。例如,使用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。