本文目录导读:

我来提供一个声音报警脚本,包含多种实现方式和实用功能:
最简版本(Windows + Linux 通用)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简单声音报警脚本
支持 Windows 和 Linux 系统
"""
import sys
import time
def simple_beep(times=3, duration=0.5):
"""最简报警 - 使用系统蜂鸣器"""
for i in range(times):
if sys.platform == 'win32':
import winsound
winsound.Beep(1000, int(duration * 1000)) # 1000Hz, 持续时间
else:
# Linux/Mac 使用终端响铃字符
print('\a', end='', flush=True)
time.sleep(duration)
time.sleep(0.2)
# 使用示例
if __name__ == "__main__":
simple_beep(times=5, duration=0.8)
print("检测到异常!")
进阶版本(带多种音效)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
多功能声音报警系统
支持多种报警方式、可配置参数
"""
import threading
import time
import sys
import os
import random
class SoundAlarm:
def __init__(self):
self.running = False
self.thread = None
self.alarm_type = "beep" # beep, melody, speech, music
def beep_win(self, frequency=1000, duration=0.5, times=3):
"""Windows 蜂鸣器"""
try:
import winsound
for _ in range(times):
winsound.Beep(frequency, int(duration * 1000))
time.sleep(0.2)
except ImportError:
self.beep_linux(duration, times)
def beep_linux(self, duration=0.5, times=3):
"""Linux 终端蜂鸣"""
for _ in range(times):
print('\a', end='', flush=True)
time.sleep(duration)
time.sleep(0.2)
def melody_alarm(self):
"""旋律报警"""
try:
import winsound
# 经典警报旋律
notes = [
(1000, 0.3), (1500, 0.3), (1000, 0.3), (1500, 0.3),
(2000, 0.5), (1500, 0.5)
]
for freq, dur in notes:
winsound.Beep(freq, int(dur * 1000))
time.sleep(0.1)
except ImportError:
# Linux 下的简单替代
self.beep_linux(duration=0.3, times=6)
def speech_alarm(self, text="警告!检测到异常情况!"):
"""语音报警"""
try:
import pyttsx3
# 使用平台自带的游戏引擎
if sys.platform == 'win32':
import win32com.client
speaker = win32com.client.Dispatch("SAPI.SpVoice")
speaker.Speak(text)
else:
os.system(f'espeak "{text}"')
except:
print(f"[语音报警] {text}")
self.beep_linux(duration=0.5, times=3)
def start_alarm(self, alarm_type=None):
"""开始报警"""
if self.running:
print("报警已在运行中")
return
self.running = True
self.alarm_type = alarm_type or "beep"
self.thread = threading.Thread(target=self._run)
self.thread.daemon = True
self.thread.start()
def stop_alarm(self):
"""停止报警"""
self.running = False
if self.thread:
self.thread.join(timeout=2)
def _run(self):
"""报警主循环"""
while self.running:
if self.alarm_type == "melody":
self.melody_alarm()
elif self.alarm_type == "speech":
self.speech_alarm()
else:
self.beep_win()
def continuous_alert(self, interval=2, times=None):
"""连续告警"""
count = 0
while (times is None or count < times):
self._run()
count += 1
time.sleep(interval)
# 使用示例
if __name__ == "__main__":
alarm = SoundAlarm()
# 简单蜂鸣
print("简单报警测试...")
alarm.beep_win(times=2)
# 旋律报警
print("旋律报警测试...")
alarm.alarm_type = "melody"
alarm.continuous_alert(interval=1, times=2)
# 语音报警
print("语音报警测试...")
alarm.speech_alarm("系统状态异常,请立即检查")
print("所有报警测试完成")
实时监控报警脚本
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
实时监控报警系统
监控系统资源并报警
"""
import psutil
import time
import logging
from datetime import datetime
import threading
import os
class MonitorAlarm:
def __init__(self):
self.setup_logging()
self.alarm = SoundAlarm()
self.thresholds = {
'cpu': 80, # CPU使用率
'memory': 90, # 内存使用率
'disk': 85, # 磁盘使用率
'uptime': 7*24*60*60 # 运行时间(秒)
}
def setup_logging(self):
"""配置日志系统"""
logging.basicConfig(
filename='monitor_alarm.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
def check_cpu(self):
"""检查CPU使用率"""
cpu_percent = psutil.cpu_percent(interval=1)
if cpu_percent > self.thresholds['cpu']:
self.trigger_alarm(f"CPU使用率过高: {cpu_percent}%")
return cpu_percent
def check_memory(self):
"""检查内存使用率"""
memory = psutil.virtual_memory()
if memory.percent > self.thresholds['memory']:
self.trigger_alarm(f"内存使用率过高: {memory.percent}%")
return memory.percent
def check_disk(self):
"""检查磁盘使用率"""
disk = psutil.disk_usage('/')
if disk.percent > self.thresholds['disk']:
self.trigger_alarm(f"磁盘使用率过高: {disk.percent}%")
return disk.percent
def check_uptime(self):
"""检查系统运行时间"""
import psutil
uptime = time.time() - psutil.boot_time()
if uptime > self.thresholds['uptime']:
self.trigger_alarm(f"系统运行时间过长: {uptime/3600:.1f}小时")
return uptime
def trigger_alarm(self, message):
"""触发报警"""
print(f"[{datetime.now()}] 报警: {message}")
logging.warning(message)
# 声音报警
self.alarm.alarm_type = "melody"
self.alarm.start_alarm()
time.sleep(5) # 报警持续5秒
self.alarm.stop_alarm()
# 发送邮件通知(可选)
# self.send_email_alert(message)
def send_email_alert(self, message):
"""发送邮件报警"""
import smtplib
from email.mime.text import MIMEText
# 配置邮件服务器
sender = "your_email@example.com"
receiver = "admin@example.com"
smtp_server = "smtp.example.com"
msg = MIMEText(f"服务器报警: {message}")
msg['Subject'] = '服务器监控报警'
msg['From'] = sender
msg['To'] = receiver
try:
with smtplib.SMTP(smtp_server, 587) as server:
server.starttls()
server.login("username", "password")
server.sendmail(sender, [receiver], msg.as_string())
logging.info(f"报警邮件已发送: {message}")
except Exception as e:
logging.error(f"发送邮件失败: {e}")
def run_monitor(self, interval=5):
"""运行监控"""
print("开始监控系统资源...")
logging.info("开始监控系统资源")
try:
while True:
cpu = self.check_cpu()
mem = self.check_memory()
disk = self.check_disk()
uptime = self.check_uptime()
print(f"[{datetime.now().strftime('%H:%M:%S')}] "
f"CPU:{cpu}% 内存:{mem}% 磁盘:{disk}% 运行:{uptime/3600:.1f}h")
time.sleep(interval)
except KeyboardInterrupt:
print("\n监控停止")
logging.info("监控已停止")
# 使用示例
if __name__ == "__main__":
monitor = MonitorAlarm()
monitor.run_monitor(interval=5) # 每5秒检查一次
命令行工具版本
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
命令行声音报警工具
用法: python alarm.py [参数]
"""
import argparse
import subprocess
import sys
import time
def main():
parser = argparse.ArgumentParser(description='命令行声音报警工具')
parser.add_argument('-t', '--time', type=str, help='报警时间 (如: 10s, 1m)')
parser.add_argument('-r', '--repeat', type=int, default=1, help='重复次数')
parser.add_argument('-f', '--frequency', type=int, default=1000, help='频率(Hz)')
parser.add_argument('-m', '--message', type=str, default='', help='报警信息')
parser.add_argument('-s', '--stop', action='store_true', help='停止之前的报警')
parser.add_argument('-l', '--list', action='store_true', help='列出系统音频设备')
args = parser.parse_args()
if args.stop:
stop_alarm()
return
if args.list:
list_audio_devices()
return
if args.time:
# 解析时间
duration = parse_time(args.time)
print(f"将在 {duration} 秒后报警")
time.sleep(duration)
# 开始报警
trigger_alarm(frequency=args.frequency,
message=args.message,
repeat=args.repeat)
def parse_time(time_str):
"""解析时间字符串"""
if time_str.endswith('s'):
return int(time_str[:-1])
elif time_str.endswith('m'):
return int(time_str[:-1]) * 60
elif time_str.endswith('h'):
return int(time_str[:-1]) * 3600
else:
return int(time_str)
def trigger_alarm(frequency=1000, message="", repeat=1):
"""触发报警"""
for i in range(repeat):
if message:
print(f"\n⚠️ {message}")
else:
print(f"\n⚠️ 报警!")
# 根据平台使用不同的音频播放
if sys.platform == 'win32':
import winsound
winsound.Beep(frequency, 1000) # 持续1秒
else:
# Linux 下使用系统声音
try:
subprocess.run(['paplay', '/usr/share/sounds/alsa/Front_Center.wav'])
except:
print('\a', end='', flush=True)
if i < repeat - 1:
time.sleep(1)
def stop_alarm():
"""停止报警"""
print("停止所有报警...")
if sys.platform == 'win32':
# Windows下可能已经结束
pass
else:
# Linux下尝试停止声音
subprocess.run(['pkill', 'paplay'])
def list_audio_devices():
"""列出音频设备"""
if sys.platform == 'win32':
print("Windows 使用系统默认音频设备")
else:
result = subprocess.run(['aplay', '-l'], capture_output=True, text=True)
print(result.stdout)
if __name__ == "__main__":
main()
网页接口版本
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Web接口声音报警系统
提供HTTP接口控制报警
"""
from flask import Flask, jsonify, request
import threading
import time
app = Flask(__name__)
class WebAlarm:
def __init__(self):
self.alarm_active = False
self.alarm_thread = None
self.alarm_type = "beep"
def start_alarm(self, alarm_type="beep"):
if not self.alarm_active:
self.alarm_active = True
self.alarm_type = alarm_type
self.alarm_thread = threading.Thread(target=self._run)
self.alarm_thread.start()
return True
return False
def stop_alarm(self):
self.alarm_active = False
if self.alarm_thread:
self.alarm_thread.join(timeout=2)
return True
def _run(self):
while self.alarm_active:
# 在这里实现具体报警逻辑
if sys.platform == 'win32':
import winsound
winsound.Beep(1000, 500)
else:
print('\a', end='', flush=True)
time.sleep(1)
alarm = WebAlarm()
@app.route('/alarm/start', methods=['POST'])
def start_alarm():
data = request.json
alarm_type = data.get('type', 'beep')
if alarm.start_alarm(alarm_type):
return jsonify({"status": "success", "message": "报警已启动"})
else:
return jsonify({"status": "warning", "message": "报警已在运行"})
@app.route('/alarm/stop', methods=['POST'])
def stop_alarm():
alarm.stop_alarm()
return jsonify({"status": "success", "message": "报警已停止"})
@app.route('/alarm/status', methods=['GET'])
def alarm_status():
return jsonify({
"status": "running" if alarm.alarm_active else "stopped",
"type": alarm.alarm_type
})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
使用场景示例
# 1. 定时任务配合使用
from alarm_script import SoundAlarm
import schedule
import time
def scheduled_task():
print("执行任务...")
# 任务逻辑
time.sleep(3)
print("任务完成")
def alarm_if_failed():
alarm = SoundAlarm()
alarm.alarm_type = "speech"
alarm.start_alarm()
time.sleep(3)
alarm.stop_alarm()
# 每5分钟执行一次任务
schedule.every(5).minutes.do(scheduled_task)
schedule.every().hour.do(alarm_if_failed)
while True:
schedule.run_pending()
time.sleep(1)
# 2. 邮件通知集成
def send_alert_with_sound(message):
alarm = SoundAlarm()
alarm.trigger_alarm(message)
send_email(message) # 你自己的邮件函数
注意事项
- 测试环境:使用前先在测试环境中试运行
- 音量控制:根据实际需要调整音量
- 兼容性:不同操作系统使用不同的硬件和软件实现
- 资源占用:连续的报警可能会消耗系统资源
- 日志记录:建议记录报警事件以便追踪
- 错误处理:添加try-except处理可能出现的异常
选择适合你的场景的方案:
- 简单场景:使用最简版本
- 监控场景:使用实时监控版本
- 远程控制:使用Web接口版本
- 定时任务:结合schedule使用
有任何问题或需要修改,请告诉我!