最近Ucloud打折,买了个续费同价的香港。2核2G30M 600G流量
询问了客服得知600G上行流量,下行流量不计费。超过600G的部分不会停机,会按照流量收费。
这建站被刷流量刷一晚上不得倾家荡产?
根据Ucloud的官方API我写了个获取已用流量并且自动关机的脚本
脚本参考官方SDK示例
脚本
# -*- coding: utf-8 -*-
import os
import time
import logging
from ucloud.core import exc
from ucloud.client import Client
# 配置参数
region = "改成你自己的"
public_key = "改成你自己的"
private_key = "改成你自己的"
project_id = "改成你自己的"
base_url = "https://api.ucloud.cn"
zone = "改成你自己的"
eip_id = "eip-XXXXX改成你自己的"
# 这个5的意思是剩余5%自动关机
threshold_percentage = 5
# 关机方式: "command" 表示命令行关机, "api_power_down" 表示通过API模拟掉电关机, "api_power_off" 表示通过API正常关机
shutdown_method = "command"
# UHost实例ID(仅在shutdown_method为"api_power_down"或"api_power_off"时使用)
uhost_id = "ulhost-XXXXX改成你自己的"
# 记录上次关机时间的文件
shutdown_time_file = "/tmp/last_shutdown_time"
def check_traffic_and_shutdown():
client = Client({
"region": region,
"public_key": public_key,
"private_key": private_key,
"project_id": project_id,
"base_url": base_url
})
try:
resp = client.unet().get_eip_exclusive_utp_info({
"Zone": zone,
"EIPId": eip_id
})
except exc.UCloudException as e:
print(f"错误: {e}")
return
eip_info = resp.get('EIPExclusiveInfo', {})
total_size_mb = eip_info.get('TotalSize', 0)
available_size_mb = eip_info.get('AvailableSize', 0)
if total_size_mb and available_size_mb:
used_size_mb = total_size_mb - available_size_mb
remaining_percentage = (available_size_mb / total_size_mb) * 100
print(f"总计流量: {total_size_mb} MB")
print(f"剩余流量: {available_size_mb} MB")
print(f"已用流量: {used_size_mb} MB")
print(f"剩余流量百分比: {remaining_percentage:.2f}%")
if remaining_percentage < threshold_percentage:
print("剩余流量低于阈值。正在关机...")
# 检查上次关机时间
if os.path.exists(shutdown_time_file):
with open(shutdown_time_file, 'r') as f:
last_shutdown_time = float(f.read().strip())
current_time = time.time()
# 如果距离上次关机时间小于24小时,则不执行关机
if current_time - last_shutdown_time < 86400:
print("上次关机时间距离现在不足24小时,不执行关机。")
return
# 记录当前关机时间
with open(shutdown_time_file, 'w') as f:
f.write(str(time.time()))
if shutdown_method == "command":
os.system('shutdown -h now')
print("系统已通过命令行关机。")
elif shutdown_method == "api_power_down":
try:
shutdown_resp = client.invoke("PoweroffULHostInstance", {
"Region": region,
"Zone": zone,
"UHostId": uhost_id
})
print("UHost实例已成功掉电关机。")
except exc.UCloudException as e:
print(f"掉电关机失败: {e}")
elif shutdown_method == "api_power_off":
try:
shutdown_resp = client.invoke("StopULHostInstance", {
"Region": region,
"Zone": zone,
"UHostId": uhost_id
})
print("UHost实例已成功关机。")
except exc.UCloudException as e:
print(f"关机失败: {e}")
else:
print("无效的关机方式。")
else:
print("流量充足。")
else:
print("无法获取流量信息。")
if __name__ == '__main__':
check_traffic_and_shutdown()
配置脚本
如果你没安装python可以先尝试安装python
apt install python3 python3-pip
然后pip安装ucloud-sdk-python3
pip install ucloud-sdk-python3
Ucloud的公钥私钥在这里申请
https://console.ucloud.cn/uaccount/api_manage
EIPID在这获取
https://console.ucloud.cn/uapi/detail?id=DescribeULHostInstance
填入资源ID点击发送请求可以找到EIPID
IPId那一栏,eip开头的就是。
Zone和Region可以在这里找
https://docs.ucloud.cn/api/summary/regionlist
project_id在这里找
我不确定每个人的是否一不一样,最好去这里看看
https://console.ucloud.cn/uapi/detail?id=GetEIPExclusiveUTPInfo
定时运行
打开终端并编辑crontab
文件:
crontab -e
在crontab
文件中添加一行来每小时执行Python脚本。例如:
0 * * * * /usr/bin/python3 /path/to/your_script.py
这里的/usr/bin/python3
是Python解释器的路径,/path/to/your_script.py
是你的Python脚本的路径。
30Mbps一小时大概消耗13.18GB,600*0.05=30 设置5%剩余流量关机差不多合适,如果你想极限点也可以自己设置。
13 条评论
问了下客服,他们有关机开机的api:
StartULHostInstance、启动轻量应用主机、启动处于关闭状态的UHost实例。
StopULHostInstance、关闭轻量应用云主机、指停止处于运行状态的ULHost实例
另外提个小问题哈,如果脚本使用命令关机后,自己又想重新启动服务器,但自动化任务又是开机启动的话,可能会陷入开关机的循环中。
好了,我把你提出的这些都加进去了
# 关机方式: "command" 表示命令行关机, "api_power_down" 表示通过API模拟掉电关机, "api_power_off" 表示通过API正常关机
脚本如果执行了自动关机,在关机前会向/tmp/last_shutdown_time输出一个上次关机的时间。
每次运行脚本会判断当前时间距离/tmp/last_shutdown_time这个文件是否超过24小时,如果在24小时以内不执行关机
有道理唉
https://console.ucloud.cn/uapi/detail?id=StartULHostInstance
https://console.ucloud.cn/uapi/detail?id=StopULHostInstance
问一下。他这个流量是一个小时刷新一次吗?我看你给的那个官方SDK示例上没有写,最近也在观望他那个同价续费的活动,就是担心流量问题,腾讯云那里倒是有流量监控的官方提醒。
另外问一下博主,他那轻量服务器有防火墙及快照备份吗?
这个脚本的逻辑是用Ucloud的API来查询剩余多少流量,如果流量到阈值就尝试自动关机。间隔时间你可以自己设置cron来获取剩余流量,没有流量监控的官方提醒。ucloud有防火墙但是没有快照备份。
这倒是了解的,我关系的是ucloud那边的流量查询是不是有延迟,以及延迟是多少的问题。毕竟腾讯云那边流量查询是有一小时延迟的,就算半个小时查询一次,也是不变的。
确定是有延迟的,延迟多少我也不清楚 你可以试着将这个脚本的关机阈值调大并且将cron获取剩余流量的间隔调小点
香港机?使用感受如何?
还行,这个站和我的导航站都挪到UCloud香港了
导航站是80888888.xyz 你可以打开下试试速度
速度感觉还行啊,有测速过吗?能达到30M吗
Retrieving speedtest.net configuration...
Testing from Ucloud Information Technology Hk (152.32.128.82)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by fdcservers.net (Hong Kong) [3.92 km]: 3.202 ms
Testing download speed................................................................................
Download: 118.13 Mbit/s
Testing upload speed......................................................................................................
Upload: 34.26 Mbit/s
速度应该是够的