方案一

验证bark服务

下载并部署Bark服务后在 PVE 主机上,手动运行以下命令,测试是否能触发通知:

1
2
3
4
curl -s "替换成bark地址链接" \
-d "message=这是一个测试通知" \
-d "sound=alarm" \
-d "group=虚拟机监控"

设置脚本

在 PVE 主机上,打开终端并输入以下命令创建一个文件:

1
nano /root/vm_monitor.sh

将以下脚本内容粘贴到文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

# 设置虚拟机ID和名称
VM_IDS=("102" "103")
VM_NAMES=("群晖NAS" "Ubuntu系统")

# 设置Bark通知的Key
BARK_KEY="your_bark_key"

# 检查虚拟机状态
for i in "${!VM_IDS[@]}"; do
VM_ID="${VM_IDS[$i]}"
VM_NAME="${VM_NAMES[$i]}"
VM_STATUS=$(qm status "$VM_ID" | awk '{print $2}')

if [ "$VM_STATUS" != "running" ]; then
# 发送Bark通知
curl -s "https://api.day.app/$BARK_KEY/$VM_NAME%20异常" \
-d "message=$VM_NAME%20已停止运行" \
-d "sound=alarm" \
-d "group=虚拟机监控"
fi
done

这里的 your_bark_key 需要替换成 Bark 应用中获取的实际 Key。输入以下命令为脚本赋予可执行权限:

1
chmod +x /root/vm_monitor.sh

设置定时任务

1
crontab -e

在文件的末尾添加以下行:

1
*/5 * * * * /root/vm_monitor.sh

代码表示每隔 5 分钟运行一次 /root/vm_monitor.sh 脚本。

方案二

第一步:创建通用 Hook 脚本

1
nano /etc/pve/hooks/vmhook.sh

粘贴以下内容(可修改地址和 Bark KEY):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

VMID="$1"
EVENT="$2"

# 虚拟机别名,可选
declare -A VM_NAMES=(
["102"]="群晖NAS"
["103"]="Ubuntu系统"
)

VM_NAME=${VM_NAMES[$VMID]:-"VM_$VMID"}

# 事件筛选
if [[ "$EVENT" == "post-stop" ]]; then
curl -s "https://api.day.app/YOUR_BARK_KEY/$VM_NAME%20已关闭" \
-d "message=虚拟机 $VM_NAME($VMID)停止运行" \
-d "sound=alarm" \
-d "group=虚拟机监控"
fi

添加执行权限

1
chmod +x /etc/pve/hooks/vmhook.sh`

为 102 和 103 添加 Hook 配置

编辑 102 配置文件:

1
nano /etc/pve/qemu-server/102.conf

在最后一行添加:hookscript: /etc/pve/hooks/vmhook.sh

编辑 103 配置文件:

1
nano /etc/pve/qemu-server/103.conf`

同样添加:hookscript: /etc/pve/hooks/vmhook.sh

测试

1
bash /etc/pve/hooks/vmhook.sh 102 post-stop