Linux 定时任务

Linux 定时任务

标签(空格分隔): linux基础

作者:Mr.Wei


1.1 定时任务Crond介绍

Crond是linux系统中用来定期执行命令/脚本或指定程序任务的一种服务或软件,一般情况下,我们安装完Centos5/6 linux操作系统之后,默认便会启动Crond任务调度服务,在我们前面的系统安装及开机启动优化的设置中,我们也设置保留了Crond开机自启动,Crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作,这个crond定时任务服务就相当于我们平时早起使用的闹钟一样。

1.2 开始做linux开机自启动服务优化

必须最低保留的启动服务: 
crond:定时任务服务 
network:网络服务 centos7里面无此项,默认开启
rsyslog:日志服务 
sshd:远程链接服务
sysstat:系统监控服务(涉及一系列监控工具)
[root@text ~]# systemctl list-unit-files | egrep "(crond|network|rsyslog|sshd|sysstat).service"
crond.service                                 enabled 
rsyslog.service                               enabled 
sshd.service                                  enabled 
sysstat.service                               enabled 
#列出所有已经加载单元的活动状态
[root@text ~]# systemctl list-units --type=service | egrep "(crond|network|rsyslog|sshd|sysstat).service"
  crond.service                      loaded active running Command Scheduler
  network.service                    loaded active running LSB: Bring up/down networking
  rsyslog.service                    loaded active running System Logging Service
  sshd.service                       loaded active running OpenSSH server daemon
  sysstat.service                    loaded active exited  Resets System Activity Logs

1.2.1小结

常用服务,必须开机启动的服务crond,sshd,network,rsyslog,sysstat

1.2.2 为什么要使用Crond定时任务?

为什么要使用定时任务呢?
我们举个例子说明:例如,我们的数据库或者代码程序需要每天晚上0点做一次全备份,这样每天夜里都需要执行的周期性工作,如果要让人操作的话,就得每天半夜爬起来,然后登录系统执行任务,执行完接着睡觉。另外,执行任务的过程也可能持续几个小时,这样一来,一个晚上我们就都不用睡觉了,这样显然是不行的。那么有什么办法来解决这个周期性的执行任务需求呢?
这就是linux系统的定时任务Crond,这相当于我们平时生活中的闹钟功能,每天晚上提前设置定时,早晨按时叫醒你。

11.2.3 linux系统的定时任务

linux系统中定时任务调度的工作可以分为以下两种情况:

  • linux系统自身定期执行的任务工作:系统周期性自行执行的任务工作,如轮询系统日志,备份系统数据,清理系统缓存等,这些任务无需我们人为干预。
[root@test ~]# ls -l /var/log/messages* #系统日志
-rw------- 1 root root 175483 Feb 21 09:41 /var/log/messages
-rw------- 1 root root 290264 Jan  6 11:15 /var/log/messages-20200106
-rw------- 1 root root 210233 Jan 12 03:29 /var/log/messages-20200112
-rw------- 1 root root 318452 Feb 13 10:23 /var/log/messages-20200213
-rw------- 1 root root 268371 Feb 20 09:41 /var/log/messages-20200220

[root@test ~]# ls -l /var/log/secure* 用户登录日志
-rw------- 1 root root  5980 Feb 21 09:18 /var/log/secure
-rw------- 1 root root  1694 Jan  6 10:47 /var/log/secure-20200106
-rw------- 1 root root   661 Jan  9 10:46 /var/log/secure-20200112
-rw------- 1 root root  1546 Feb 13 09:52 /var/log/secure-20200213
-rw------- 1 root root 12033 Feb 20 09:03 /var/log/secure-20200220

  • 用户执行的任务工作:某个用户或系统管理员定期要做的任务工作,例如每隔5分钟和互联网上时间服务器进行时间同步(这是安装系统基础优化部分的内容),每天晚上0点备份网站站点数据及数据库数据,一般这些工作需要由每个运维自行设置才行。
例如:服务器时间同步
[root@test ~]# crontab -l
no crontab for root
这里没有设置定时任务
用户执行的任务工作,也就是我们运维管理人员执行的任务工作,因此,这个用户执行的任务是我们今天讨论的重点

1.2.4 linux系统下定时任务软件的种类

严格的说,linux系统下的定时任务软件还真不少,例如:at,crontab,anacron
假如:某天晚上需要处理一个任务,仅仅是这一天的晚上,属于突发性的工作任务。要执行at命令,还需要启动一个名为atd的服务才行,在实际工作中,还真没碰到需要用到它的时候。因此,建议大家不要深入研究了,到此我们讲解到这里为止即可。

crontab(命令):正如前面所说的这个命令可以周期性的执行任务工作,例如:每五分钟做一次服务器时间同步。要执行crontab这个命令,也需要启动一个服务crond才行,这个crontab命令是生产工作中最常用到的命令,请大家务必掌握。

  • 开机自启动crond服务
[root@test ~]# systemctl list-unit-files | egrep crond              
crond.service                                 enabled

[root@test ~]# systemctl status crond
* crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-02-20 16:42:47 CST; 16h ago
 Main PID: 6439 (crond)
   CGroup: /system.slice/crond.service
           `-6439 /usr/sbin/crond -n

Feb 20 16:42:47 mysql01 systemd[1]: Started Command Scheduler.
Feb 20 16:42:48 mysql01 crond[6439]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 69% if used.)
Feb 20 16:42:48 mysql01 crond[6439]: (CRON) INFO (running with inotify support)
  • 如何查看进程
[root@test ~]# ps -ef | grep crond
root       6439      1  0 04:31 ?        00:00:00 /usr/sbin/crond -n
root       8271   8252  0 09:39 pts/0    00:00:00 grep --color=auto crond

anacron:这个命令主要用于非7*24小时开机的服务器准备的,anacron并不能指定具体时间执行任务工作,而是以天为周期或者在系统每次开机后执行的任务工作。
它会检测服务器停机期间应该执行,但是并没有进行的任务工作,并将该任务执行一遍。 小结提示:

  • 我们所说的crond服务是运行的程序,而crontab是用来管理用户的定时任务(规则)的命令
  • crond服务是企业生产工作中常用的重要服务,at和anacron很少用,可以忽略
  • 几乎每个服务器都会用到crond服务
  • 上千服务器可以开发分布式定时任务项目方案(批量管理ansible/saltstack)

1.3 定时任务Crond使用说明

1.3.1 指令语法

crontab [-u user] { -l | -e | -r | -i }

查看系统帮助

[root@test ~]# crontab --help
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
Usage:
 crontab [options] file
 crontab [options]
 crontab -n [hostname]

Options:
 -u <user>  define user
 -e         edit user's crontab
 -l         list user's crontab
 -r         delete user's crontab
 -i         prompt before deleting
 -n <host>  set host in cluster to run users' crontabs
 -c         get host in cluster to run users' crontabs
 -s         selinux context
 -x <mask>  enable debugging

Default operation is replace, per 1003.2

crontab -l 查看当前用户的定时任务配置

[root@test ~]# crontab -l
*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1

crontab -e 进入当前用户的定时任务vim编辑模式

crontab -u 用户名 -l 查看指定用户的定时任务设置

[root@test ~]# crontab -u root -l
*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1
[root@test ~]# crontab -u weilei -l
no crontab for weilei

1.3.2 指令说明

通过crontab我们可以在固定的间隔时间执行指定的系统指令或script脚本。时间间隔的单位可以是分钟,小时,日,月,周及以上的任意组合(注意:日和周不要组合)。crond服务通过crontab命令可以很容易的实现周期性的日志分析或数据备份等企业运维场景工作

1.3.3 使用者权限及定时任务文件

文件说明
/etc/cron.deny(拒绝)该文件中所列用户不允许使用crontab
/etc/cron.allow(允许)该文件优先级高于cron.deny(默认不存在,一般不用)
/var/spool/cron/所有用户crontab配置文件默认都存在此目录,文件名以用户名命名
[root@test ~]# cat /etc/cron.deny 
[root@test ~]# echo "weilei" >> /etc/cron.deny 
[root@test ~]# cat /etc/cron.deny 
weilei
[root@test ~]# su weilei
[weilei@test root]# crontab -l
You (weilei) are not allowed to use this program (crontab)
See crontab(1) for more information
[weilei@test root]# crontab -e
You (weilei) are not allowed to use this program (crontab)
See crontab(1) for more information
#用户weilei没有设置定时任务的权限
[root@test ~]# ls /var/spool/cron/
root
[root@test ~]# cat /var/spool/cron/root
*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1

1.3.4 指令选项说明含义表

参数含义
-l查看crontab文件内容
-e编辑crontab文件内容
-r删除crontab文件内容(用的很少)
-u user指定使用的用户执行任务

特别强调:-r参数在生产中很少用,没什么特殊需求必须要用-e进入编辑即可

补充:

crontab { -l | -e } 实际上就是在操作/var/spool/cron/当前用户这样的文件 使用crontab命令的优点:
1、crontab可以检查语法
2、输入方便

1.3.5 定时任务指令的使用格式

默认情况下,当用户建立定时任务规则后,该规则记录对应的配置文件会存在于/var/spool/cron中,其crontab配置文件对应的文件名与登录的用户名一致,如:root用户的定时任务配置文件为/var/spool/cron/root
Crontab定时任务的书写格式很简单,用户的定时任务规则一般分为6个段(每个段通过空格来分隔,系统的定时任务为/etc/crontab,分为7个段,空格来分隔),前五段为时间的设定段,第六段为所要执行的命令或脚本任务段

用户定时任务实例:

01 * * * * cmd #每小时的01分钟执行
02 04 * * * cmd #每天4点的02分钟执行
22 14 * * 00 cmd #每周日的14点22分执行
42 04 01 * * cmd #每月1日的4点42分执行
提示:
1,cmd为要执行的命令或脚本,例如:/bin/sh /server/scripts/weilei.sh
2,每个列之间必须要有一个空格。多个空格可以么?自己实践

1.3.6 crontab 语法格式中时间段的含义如下表

段	含义
第一段	代表分钟  0-59
第二段	代表小时  0-59
第三段	代表日,天 1-31
第四段	代表月份  1-12
第五段	代表星期,周几 week 0-6 周日(0 or 7)或者 sun  mon tue wed thu fri sat
提示:时间记忆口诀:分时日月周。取值范围记忆:正常日期时间范围,小学生都会的了

1.3.7 crontab 语法格式中特殊符号含义如下表

特殊符号含义
**号,表示任意时间都,实际就是“每”的意思
-减号表示分隔符,表示一个时间范围,区间段,如17-19点,例如:每天的17,18,19点的00分执行任务。00 17-19 * * * cmd
逗号,表示分隔时段的意思例如每天的5点10点00分执行任务,00 5,10 * * * cmd
/nn代表数字,即“每隔n单位时间”,例如:每10分钟执行一次任务可以写成/10 * * * cmd,其中,/10,的范围是0-59,因此也可以写成0-59/10

生产环境常用Crontab专业实例

2.1书写crontab定时任务多个基本要领

2.1.1 规范定时任务两例

例1:每分钟打印一次自己的名字拼音全拼到“/test/log/weilei 自己的名字命名的文件”中。

[root@test ~]# crontab -l
*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1
* * * * * /bin/echo "weilei" >> /test/log/weilei
[root@test ~]# cat /test/log/weilei 
weilei
weilei
  • 解答知识小结:
  • 定时任务要加注释
  • 如果已经要定向到文件中,结尾不要有>/dev/null 2>&1
  • /server/log目录必须要存在才能出结果,如没有创建这个目录。 - 定时任务中的路径一定要绝对路径
  • crond服务必须首先开启
  • 查看定时任务日志tail /var/log/cron

例2:每周六,日上午9点和下午14点(执行/test/scripts/weilei.sh).要求:/test/scripts/weilei.sh脚本的功能是打印I miss you wendy并且打印此时时间:

[root@test ~]# crontab -l

00 9,14 * * 0,6 /bin/sh /server/scripts/chensiqi.sh >/dev/null 2>&1

步骤:

  • 创建对应的目录
[root@test ~]# mkdir /test/scripts -p
  • 命令行测试
[root@test ~]# date +'%Y-%m-%d %H:%M:%S'
  • 书写脚本
[root@test ~]# cat /test/scripts/weilei.sh
#!/bin/bash
Date=`date +'%Y-%m-%d %H:%M:%S'`
/bin/echo "I miss you wendy at $Date"
  • 命令行测试脚本
[root@test ~]# sh /test/scripts/weilei.sh
I miss you wendy at 2020-02-21 11:44:13
  • 编辑定时任务(让他快速执行*****)
[root@test ~]# crontab -l
# At 9:00 a.m. and 14:00 p.m. on Saturday and Sunday (execute / test / scripts / WeiLei. SH). The function of / test / scripts / weilei.sh script is to print the date of the day
# The autor is weilei
00 9,14 * * 0,6 /bin/sh /test/scripts/weilei.sh >>/test/log/test1

##测试定时任务
[root@test ~]# /bin/sh /test/scripts/weilei.sh >>/test/log/test1
[root@test ~]# cat /test/log/test1 
I miss you wendy at 2020-02-21 14:57:02

定时任务一定要尽量用脚本实现。 命令行操作成功,然后放入脚本执行(/bin/sh 脚本全路径)成功,最后在配置任务复制操作成功的命令行脚本,再定时任务里黏贴配置。 加/bin/sh执行脚本 /bin/sh /server/script/chensiqi.sh 要把脚本的执行结果定向到空或者是一个文件中,不要什么都不加。

2.1.2 定时任务书写要领

要领1:为定时任务规则加必要的注释

要领2:执行shell脚本任务前加/bin/sh

要领3:定时任务命令或脚本的结尾加>/dev/null 2>&1

要领4:定时任务命令超过2条的命令执行,最好用脚本文件

* * * * * sleep 1;echo chensiqi >> /server/log/chensiqi.log
标准写法:
[root@chensiqi /]# cat /server/scripts/log.sh
sleep1
echo weilei >> /server/log/weilei.log
定时任务写法:
* * * * * /bin/sh /server/scripts/log.sh >dev/null 2>&1

要领5:在指定用户下执行相关定时任务

需要root权限执行的任务可以登录到root用户下然后设置,如果不需要root权限,可以登录到普通用户下(也可以直接在root下crontab -u weilei -e 的写法直接设置),然后设置。这里要特别注意不同用户的环境变量问题,如果是调用了系统环境变量/etc/profile(如生产场景中java程序的定时任务),最好在程序脚本中将用到的环境变量重新export下。

要领6:生产任务程序不要随意打印输出信息。

尽量关闭取消没有用的输出(命令的执行过程)
1,定向到文件
2,>/dev/null 2>&1
在开发定时任务程序或脚本时,在调试好脚本程序后,应尽量把DEBUG及命令输出的内容信息屏蔽掉,如果确实需要输出日志,可定向到执行日志文件里,避免产生系统垃圾。

要领7:定时任务命令或程序最好写到脚本里执行

要领8:定时任务执行的脚本要规范路径

要领9:配置定时任务规范操作过程,防止出错。

1,首先要在命令行操作成功,然后复制成功的命令到脚本里,在各个细小环节减少出错的机会。
2,然后测试脚本,测试成功后,复制脚本的规范路径到定时任务配置里,不要手敲。
3,先在测试环境下测试,然后正式环境规范部署

小结书写定时任务的若干要领方法:
要领1:为定时任务规则加必要的注释。
要领2:执行shell脚本任务前加/bin/sh
要领3:定时任务命令或脚本结尾加>/dev/null 2>&1
要领4:定时任务命令或程序最好写到脚本里执行
要领5:在指定用户下执行相关的定时任务
要领6:生产任务程序不要随意打印输出信息
要领7:定时任务执行的脚本要规范路径(/server/scripts)
要领8:配置定时任务规范操作过程

2.1.3 定时任务不加>/dev/null 2>&1的后果

如果定时任务规则结尾不加>/dev/null
2>&1等命令配置,有可能有大量输出信息,时间长了,可能由于系统未开启邮件服务而导致邮件临时目录/var/spool/clientmqueue 文件数猛增的隐患发生,大量文件会占用大量磁盘inode节点(每个文件占一个inode),以致磁盘inode满而无法写入正常数据

提示:上面的>/dev/null 2>&1 写法也可以写成1>/dev/null 2>/dev/null,例:$JAVA-jar $RESIN_HOME/lib/resin.jar $ARGS stop 1>/dev/null 2>/dev/null 此写法来自resin服务默认启动脚本
上述是centos5.8的情况,假如系统不安装sendmail(Centos6.4),那是不是就没有上述问题了?
企业案例::如果定时任务规则结尾不加>/dev/null 2>&1,很容易导致硬盘inode空间被占满,从而系统服务不正常。
当一个定时任务执行的时候,就会给系统发一封邮件。sendmail邮件服务,经常是关闭的,所以定时任务发送的邮件就会临时堆在/var/spool/clientmqueue/,时间长了,/var/spool/clientmqueue/文件数特别多。Centos5的时候一定会有这个问题。

Centos6呢?

定时任务没定向到空,postfix服务没有开启的话,那么每执行一次定时任务,/var/spool/postfix/maildrop/文件夹下就会产生一个小文件,随着时间累计,就会越来越多,导致出现问题。
如果开启了邮件服务,就会直接给root发送邮件。
解决方法:
1,删除大量小文件/var/spool/postfix/maildrop/下所有文件(ls|xargs rm -f)
2,临时开启postfix(sendmail)服务
3,vi /etc/crontab:将‘MAILTO=root’替换成‘MAILTO=“”’然后service crond restart即可。(如果还不行,crontab -e 第一行增加MAILTO=“”)
目录名解释
/var/spool/clientmqueuecentos5.xsendmail临时邮件文件目录,有很多原因会导致这个目录碎文件很多,比如crontab定时任务命令不加>/dev/null等,并且sendmail服务没开。工作中偶尔会因为该目录文件太多,导致/var所在的分区inode数量被消耗尽,无法写入文件的情况
/var/spool/postfix/maildrop/centos6.x postfix临时队列目录/var/spool/postfix/maildrop/默认定时任务执行时会给root发邮件,如果邮件服务不开,就会把邮件推到上述目录。当定时任务结尾不加>/dev/null 2>&1的时候,定时任务就会在上述目录存大量小文件

2.2 定时任务的系统配置文件/etc/crontab

[root@test ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
SHELL=/bin/bash #shell解释器
PATH=/sbin:/bin:/usr/sbin:/usr/bin #PATH环境变量
MAILTO=root #定义如果任务有输出,发给哪个用户,默认发给root用户
HOME=/ #定时任务执行命令从根目录开始

轮询的日志(日志轮询):周期性切割日志 系统的定时任务+logrotate

[root@test ~]# cat /etc/cron.daily/logrotate 
#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

[root@test ~]# ll /var/log/messages*
-rw------- 1 root root 188725 Feb 21 15:20 /var/log/messages
-rw------- 1 root root 290264 Jan  6 11:15 /var/log/messages-20200106
-rw------- 1 root root 210233 Jan 12 03:29 /var/log/messages-20200112
-rw------- 1 root root 318452 Feb 13 10:23 /var/log/messages-20200213
-rw------- 1 root root 268371 Feb 20 09:41 /var/log/messages-20200220
[root@test ~]# ll /var/log/secure*
-rw------- 1 root root  6644 Feb 21 11:11 /var/log/secure
-rw------- 1 root root  1694 Jan  6 10:47 /var/log/secure-20200106
-rw------- 1 root root   661 Jan  9 10:46 /var/log/secure-20200112
-rw------- 1 root root  1546 Feb 13 09:52 /var/log/secure-20200213
-rw------- 1 root root 12033 Feb 20 09:03 /var/log/secure-20200220

2.3 企业生产场景如何调试crontab定时任务

2.3.1 增加执行任务频率调试任务(某些任务不能用于生产环境)

在调试时,把任务执行频率调快一点,如:每分钟,每5分钟执行一次,或者比当前时间推迟5分钟以后,看能否执行,是不是按照你想象的去执行了,如果正常没问题了,在改成需要的任务的执行时间。

强调:有些计划任务是不允许频繁执行的,例如:定时往数据库里插入数据,这样的任务就要在测试机上测试好,然后部署到正式线上,这样正式工作出问题的机会就少了。

规范的公司开发和运维人员操作流程,个人的开发配置环境-->办公室的测试环境-->idc机房的测试环境-->idc机房的正式环境。

使用log文件调试任务
/bin/sh /server/scripts/del_sys_file.sh >/tmp/file.log 2>&1

2.3.2 调整系统时间调试任务(不能用于生产环境)

如字面意思,调整系统时间,以达到接近触发计划任务的目的进行调试。

2.3.3 通过脚本日志输出调试定时任务

在脚本中加入日志输出,然后把输出打到指定的日志中,然后观察日志内容结果,看是否执行或正确执行。或像下面的内容把脚本结果定向到一个log文件里,重定向>即可,不需要>>追加,这样日志就不会一直变大。

2.3.4 注意环境变量导致的定时任务故障

PATH 在调试java程序任务的时候,注意环境变量,把环境变量的定义加到脚本里。

例:
[root@test ~]# cat /scripts/resin/shell/Task.sh
#!/bin/bash
export JAVA_HOME=/application/jdk1.6
export PATH=$JAVA_HOME/bin:$PATH
export SH_HOME=/application/resin/webapps/ROOT/
export LIB=$SH_HOME/WEB-INF/lib
以下省略...

定时任务:
00 09,14 * * * nohup /scripts/resin/shell/Task.sh & >/app/log.log 2>&1
提示:命令也要尽可能写全路径。

2.3.5 通过crond定时任务服务日志调试定时任务

查看定时任务服务日志

[root@test ~]# tail -10 /var/log/cron
Feb 21 14:56:36 mysql01 crontab[9503]: (root) BEGIN EDIT (root)
Feb 21 14:56:39 mysql01 crontab[9503]: (root) END EDIT (root)
Feb 21 14:56:42 mysql01 crontab[9505]: (root) LIST (root)
Feb 21 14:57:01 mysql01 crond[6439]: (root) RELOAD (/var/spool/cron/root)
Feb 21 15:00:01 mysql01 CROND[9535]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Feb 21 15:01:01 mysql01 CROND[9541]: (root) CMD (run-parts /etc/cron.hourly)
Feb 21 15:01:01 mysql01 run-parts(/etc/cron.hourly)[9541]: starting 0anacron
Feb 21 15:01:01 mysql01 run-parts(/etc/cron.hourly)[9550]: finished 0anacron
Feb 21 15:10:02 mysql01 CROND[9581]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Feb 21 15:20:01 mysql01 CROND[9587]: (root) CMD (/usr/lib64/sa/sa1 1 1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值