RHCE9学习指南 第20章 计划任务

在这里插入图片描述
有时需要在某个指定的时间执行一个操作,此时就要使用计划任务了。计划任务有两种:一个是at计划任务,另一个是crontab计划任务。
下面我们分别来看这两种计划任务的使用。

20.1 at

at计划任务是一次性的,到了指定的时间点时就开始执行指定的命令,执行完以后,不会重复执行这个命令。
首先查看系统中是否存在着at计划任务,命令是
atq或at -l(字母l)
命令如下。

[root@server ~]# atq
[root@server ~]# 
[root@server ~]# at -l
[root@server ~]# 

这两个命令都没有任何输出,说明当前系统中并不存在任何的计划任务。下面开始创建at计划任务,at的用法如下。

at 时间点<按【Enter】键>
> 输入要执行的命令
Ctrl+d 提交

**步骤1:**在2025年12月12日执行hostname命令,命令如下。

[root@server ~]# at 2025-12-12
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT> 此处按【Ctrl+D】组合键
job 1 at Fri Dec 12 19:11:00 2025
[root@server ~]#

这里只是指定了日期,并没有指定在2025年12月12日的几点执行。那么,创建这个计划任务时是几点几分,例如,这里是在19点11分创建的at计划任务,那么到了2025年12月12日的19点11分就要自动执行hostname命令了。
如果要指定某个时间点,格式如下。

at 时间 日期 <按【Enter】键>
> 输入要执行的命令
Ctrl+d 提交

**步骤2:**例如,要在2025年12月12日上午10点执行hostname命令,则执行如下操作。

[root@server ~]# at 10:00 2025-12-12
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 2 at Fri Dec 12 10:00:00 2025
[root@server ~]#

注意:

(1)这里是24小时制的,所以10:00指的是上午10点,如果想指明是晚上10点,则要写22:00。
(2)写时间最多只能精确到分不能精确到秒。

这里上午用AM表示,下午用PM表示。例如,要在2025年12月12日下午10点执行hostname命令,则执行如下操作。

[root@server ~]# at 10pm 2025-12-12
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 3 at Fri Dec 12 22:00:00 2025
[root@server ~]#

at也支持某天之后的某个时间点运行一个命令,例如,3天之后的下午4点执行hostname命令,则执行如下操作。

[root@server ~]# at 4pm + 3days
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 4 at Fri Dec 22 16:00:00 2023
[root@server ~]#

这里+两边可以有也可以没有空格,这里days可以换成weeks表示3周之后的下午4点。
如果想在第二天下午4点执行hostname,则执行如下操作。

[root@server ~]# at 4pm + 1days
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 5 at Wed Dec 20 16:00:00 2023
[root@server ~]#

或者用关键字tomorrow,如果使用关键字tomorrow,则不需要加+,执行如下命令。

[root@server ~]# at 4pm  tomorrow
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 6 at Wed Dec 20 16:00:00 2023
[root@server ~]#

上面的两条命令都是表示第二天的下午4点执行hostname命令。
这样的关键字还包括today,表示“今天”。例如,今天晚上10点执行hostname命令,则执行如下命令。

[root@server ~]# at 10pm today
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 7 at Fri Dec 19 22:00:00 2023
[root@server ~]#

如果是今天执行一个命令,关键字today是可以不要写的,不写日期默认就是“今天”的意思。

[root@server ~]# at 10pm 
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 8 at Tue Dec 12 22:00:00 2023
[root@server ~]#

如果要表示几分钟之后或几小时之后,可以用关键字now。例如,要2小时之后执行hostname,则执行如下操作。

[root@server ~]# at now+2hours
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 9 at Tue Dec 12 13:23:00 2021
[root@server ~]#

如果想1分钟之后删除/tmp下面所有的内容,可以执行如下操作。

[root@server ~]# at now+1minutes
warning: commands will be executed using /bin/sh
at> rm -rf /tmp/*
at> <EOT>
job 10 at Tue Dec 19 11:25:00 2023
[root@server ~]# 

1分钟之后就是11点25分,开始执行 rm -rf /tmp/*命令。下面来验证一下,先查看/tmp中的内容。

[root@server ~]# date ; ls /tmp
20231219日 星期二 11:24:51 CST...输出...
vmware-root_943-4013723344
[root@server ~]# 

现在是11点24分,等一会到11点25分时再次查看/tmp中的内容。

[root@server ~]# date ; ls /tmp
20231219日 星期二 11:25:02 CST
[root@server ~]#

可以看到,/tmp中的内容已经被清空。
到现在为止已经做了很多个at计划任务了,现在来查看一下有多少个了。通过atq或at -l都可以查看。

[root@server ~]# atq
1	Fri Dec 12 19:11:00 2025 a root
2	Fri Dec 12 10:00:00 2025 a root
3	Fri Dec 12 22:00:00 2025 a root...省略...
9	Tue Dec 19 13:23:00 2023 a root
[root@server ~]#

这里可以看到,每个at计划任务前都有一个编号。如果要删除某个at计划任务,则用如下命令。

	atrm N 或者at -d N

这里的N指的是atq查看出来的前面的编号。
假设现在要删除编号为9的at计划任务,执行下面的命令。

[root@server ~]# atrm 9
[root@server ~]# 

如果删除编号为5到8的这些at计划任务,执行如下命令。

[root@server ~]# atrm {5..8}

查看现在还有的at计划任务。

[root@server ~]# atq
1	Fri Dec 12 19:11:00 2025 a root
2	Fri Dec 12 10:00:00 2025 a root...输出...
[root@server ~]#

5到9都已经删除了,现在只剩下1到4了。
查看at计划任务的具体内容的命令如下。
at -c N
这里N是指的是atq结果中前面的编号,例如,要查看第一个at计划任务的内容,可以通过如下命令。

[root@server ~]# at -c 1 | tail -3
${SHELL:-/bin/sh} << 'marcinDELIMITER3efac337'
hostname
marcinDELIMITER3efac337
[root@server ~]#

这里at -c 1的结果太多,所以通过管道传递给tail命令,获取最后3行的内容。可以看到,第一个at计划任务中执行的命令是hostname命令。
任何用户都是可以创建at计划任务的,下面使用tom用户创建一个at计划任务。在第二个终端中使用tom登录,然后用atq查看是否有计划任务。

[tom@server ~]$ atq
[tom@server ~]$

这里tom用户并没有at计划任务,下面tom随变创建一个计划任务,例如,3小时之后执行hostname命令。

[tom@server ~]$ at now+3hours
warning: commands will be executed using /bin/sh
at> hostname
at> <EOT>
job 11 at Tue Dec 19 21:21:00 2023
[tom@server ~]$

这里是可以正常创建的,如果要禁止哪个用户创建at计划任务,只要把这个用户名写入/etc/at.deny中即可,一行一个用户。下面练习禁止tom用户创建at计划任务,使用root做如下操作。

[root@server ~]# echo tom > /etc/at.deny 
[root@server ~]# cat /etc/at.deny
tom
[root@server ~]#

凡是出现在/etc/at.deny文件中用户都是不允许做at计划任务的了。切换到tom用户创建at计划任务。

[tom@server ~]$ at now+1hours
You do not have permission to use at.
[tom@server ~]$

这里已经没有权限创建了。
如果想继续允许tom能创建at计划,有两种方法。
(1)把tom用户从/etc/at.deny中删除。
(2)把tom用户添加到/etc/at.allow中。
/etc/at.allow这个文件默认不存在,需要创建出来,且at.allow的优先级要高于at.deny,所以tom如果同时出现在这两个文件中,那么at.allow生效。
下面设置tom可以创建at计划任务,使用root做如下操作。

[root@server ~]# echo tom > /etc/at.allow
[root@server ~]# cat /etc/at.allow
tom
[root@server ~]# cat /etc/at.deny 
tom
[root@server ~]#

现在tom用户在at.allow和at.deny中都存在,at.allow生效,所以tom是可以创建at计划任务的。切换到tom用户创建at计划任务。

[tom@server ~]$ at now+1hours
warning: commands will be executed using /bin/sh
at> 这里能看到提示符,然后按【Ctrl+C】组合键
at> ^C[tom@server ~]$ 
[tom@server ~]$

可以看到了at提示符,说明可以tom用户可以创建at计划任务了,按【Ctrl+C】终止。

20.2 crontab

at计划任务是一次性的,执行完就结束,不会重复执行。如果想定期执行某个任务,例如,每周日凌晨2点执行一个命令,这时就要用到crontab了。
查看当前用户是否有crontab计划任务,可以用crontab -l。如果要查看其他用户是否有crontab计划任务可以用crontab -l -u 用户名,不过-u这个选项只有root才能用。
**步骤1:**使用root用户查看自己有没有crontab计划任务,命令如下。

[root@server ~]# crontab  -l
no crontab for root
[root@server ~]# 

**步骤2:**使用root用户查看tom用户是否具有crontab计划任务,命令如下。

[root@server ~]# crontab  -l -u tom
no crontab for tom
[root@server ~]#

创建计划任务的命令是crontab -e ,如果为其他用户创建crontab计划任务用crontab -e -u 用户名。当使用crontab -e命令时,会打开一个临时文件,用vim一样的语法来编辑此文件即可,先按【I】键进入插入模式,编辑完成之后,按【Esc】键退回到命令模式,在末行模式中输入wq保存退出。在此文件中凡是以#开头的,都是注释行。
crontab定义计划任务的语法如下。
分 时 天 月 周 命令
几个时间单位表示的意义如下。

(1)分:几点几分的分。
(2)时:几点,24小时制。
(3)天:几号。
(4)月:几月份。
(5)周:星期几。

这几个时间单位可以用空格,也可以用【Tab】键来分隔。
如果不考虑某个时间单位,例如,不管今天是几号,只要不是周末我们就要上班,不考虑“天”的情况下,那么可以用*表示。

这里每个时间点都可以写多个值,用英文逗号“,”隔开,例如,在分的位置写“0,1,5,10”,表示0分、1分、5分、10分。

也可以用横杠“-”表示“到”的意思,例如,在分的位置写“0-10”,表示0到10分。这里"0-10"的完整写法是“0-10/1”,表示从0分到10分的每一分钟,从0开始每次增加1,然后到10。如果表示 “每N分钟”,则写成“0-10/N”,例如,0到10中每2分钟,则写成“0-10/2”,则表示为0分,2分,4分,6分,8分,10分。

练习1:

每天早晨7点整执行hostname命令,如果写成如下的命令。

#分 时  天    月   周*   7    *    *    *       hostname

其实,这种写法是不对的,第一个位置是分,这里写成了*,表示7点的每一分,包括0分、1分…。但是所谓7点整的意思是7点0分,所以要写成如下所示的代码。

#分 时  天    月   周
0   7	 *    *    *	   hostname

练习2:

每周1到周5早上7点整执行hostname命令,命令如下。

#分 时    天    月    周
0   7     *     *    1,2,3,4,5       hostname

这里可以写成如下所示的命令。

#分 时    天    月    周
0   7     *     *    1-5       hostname

这里1-5表示周一到周五,如果是周六的上午7点,就不会执行hostname命令。

练习3:

第一季度中每周一到周五的早上7点整执行 hostname,命令如下。

#分 时    天     月    周
0   7     *     1-3    1-5       hostname

一年的第一季度是1-3月份,这里分、时、月、周(没有天)是"和"的关系,这4个时间单位必须都要满足才能执行hostname命令。
所以,5月份的周三早晨7点整是不会执行hostname命令的,因为“月”没有满足条件。

练习4:

第一季度中每月上旬的早上7点整执行 hostname,命令如下。

#分 时    天       月    周
0   7     1-10     1-3    *       hostname

一年的第一季度是1-3月份,每月上旬是1到10号,这里分、时、天、月(没有周)是“和”的关系,这4个时间单位必须都要满足才能执行hostname命令。
所以,5月8号早晨7点整是不会执行hostname命令的,因为“月”没有满足条件。

练习5:

第一季度中每月上旬的早上7点整执行 hostname,命令如下。

#分 时    天       月    周
0   7     1-10     1-3    *       hostname

一年的第一季度是1-3月份,每月上旬是1到10号,这里分、时、天、月(没有周)是“和”的关系,这4个时间单位必须都要满足才能执行hostname命令。
大家要记住,“天”和“周”时间是“或”的关系,即

(1)分、时、天、月同时满足了,即使“周”不满足条件,也会执行指定的命令。
(2)分、时、月、周同时满足了,即使“天”不满足条件,也会执行指定的命令。

练习6:

在5个时间点都写的情况,命令如下。

#分 时    天       月    周
0   7     1-10     1-3    1-5       hostname

这里天和周的位置都写了,本句的意思并不是说 每年1到3月份的上旬,且要满足周一到周五的早晨7点整才执行hostname。

这句的意思是:
每年的1到3月份这3个月,每月1到10号或周一到周五(二者满足其一),早晨7点整都会执行hostname命令。这条其实综合了上面练习4和练习5中的意思。
现在最终的计划任务内容如下。

[root@server ~]# crontab  -l
#分   时    天       月     周       命令
0     7      *        *      *	    hostname...输出...
0     7     1-10     1-3    1-5     hostname
[root@server ~]# 

如果要编辑计划任务,通过crontab -e重新编辑,如果要删除执行crontab -r即可,命令如下。

[root@server ~]# crontab -r
[root@server ~]# crontab -l
no crontab for root
[root@server ~]#

普通用户也是可以做计划任务的,如果不想让这个用户做计划任务,则把这个用户写入/etc/cron.deny就可以了,一行一个用户。这个文件默认为空的,命令如下。

[root@server ~]# cat /etc/cron.deny 
[root@server ~]#

如果不希望tom创建crontab计划任务,则把tom写入这个文件中,命令如下。

[root@server ~]# echo tom > /etc/cron.deny
[root@server ~]# cat /etc/cron.deny
tom
[root@server ~]#

然后在第二个标签中用tom登录,然后测试创建一个crontab计划任务,命令如下。

[tom@server ~]$ crontab  -e
You (tom) are not allowed to use this program (crontab)
See crontab(1) for more information
[tom@server ~]$

可以看到,tom用户现在是没法创建crontab计划任务的了。
如果又想让tom去可以做计划任务,有以下两种方式。

(1)把tom从/etc/cron.deny中删除,这种方式大家自行练习。
(2)创建/etc/cron.allow,这个文件默认不存在,把tom用户名写到此文件中。

命令如下。

[root@server ~]# ls /etc/cron.allow
ls: 无法访问'/etc/cron.allow': 没有那个文件或目录
[root@server ~]# echo tom > /etc/cron.allow
[root@server ~]#

现在tom既出现在/etc/cron.allow中又出现在/etc/cron.deny中,命令如下。

[root@server ~]# cat /etc/cron.allow
tom
[root@server ~]# cat /etc/cron.deny 
tom
[root@server ~]#

此时cron.allow生效。
在第二个标签中用tom登录,创建crontab计划任务是能够创建的。
系统中也自带一些crontab计划任务,在/etc/中存在几个以cron开头的目录,命令如下。

[root@server ~]# ls /etc/cron*
/etc/cron.allow  /etc/cron.deny  /etc/crontab/etc/cron.d:
0hourly  raid-check/etc/cron.daily:
logrotate/etc/cron.hourly:
0anacron/etc/cron.monthly:/etc/cron.weekly:
[root@server ~]#

每天都会执行一次/etc/cron.daily中的脚本,每小时都会执行一次/etc/cron.hourly中的脚本,每月都会执行一次/etc/cron.monthly中的脚本,每周都会执行一次/etc/cron.weekly中的脚本。

作业

1.使用root用户做一个at计划任务,要求在2024年-12月-21日晚上10点执行一个命令/bin/aa.sh(这里假设/bin/aa.sh已经存在)。

2.使用root用户为lduan做一个crontab计划任务,要求每隔5分钟都执行一个命令hostname -s。

3.为root做一个crontab计划任务,要求每周日凌晨2点执行脚本/bin/full_back.sh(这里假设/bin/full_back.sh已经存在)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/613477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac图片格式转换软件有哪些?推荐6个实用软件

mac图片格式转换软件有哪些&#xff1f;在数字时代&#xff0c;图片格式的转换已成为我们日常工作中不可或缺的一部分。对于Mac用户来说&#xff0c;选择一款高效、便捷的图片格式转换软件尤为重要。本文将为你介绍几款备受推崇的Mac图片格式转换软件&#xff0c;让你轻松应对各…

MySQL 5.7.35下载安装使用_忘记密码_远程授权

文章目录 MySQL 5.7.35下载安装使用_忘记密码_远程授权MySQL下载地址mysql安装点击安装&#xff0c;最好以管理员身份运行选择自定义安装选择64位勾选启动自定义产品执行点击同意点击下一步点击执行下一步配置数据库端口号设置登录密码&#xff0c;如果密码忘记&#xff0c;下面…

最新PyCharm安装详细教程及pycharm配置_pycharm安装教程

目录 一、PyCharm简介及其下载网站 二、单击网站的Downloads&#xff0c;进入二级页面&#xff0c;选择对应的操作系统下载PyCharm 三、PyCharm的安装程序的安装及其配置(configuration) 1、运行PyCharm Setup 2、安装位置设置 3、安装选项设置 4、开始菜单中PyCharm快捷方式的…

CMake入门教程【高级篇】管理MSVC编译器警告

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.什么是MSVC?2.常用的屏蔽警告3.MSVC所有警告4.target_compile_options用法5.如何在CMake中消除MSVC的警告?6.屏蔽警告编写技巧

如何使用css隐藏掉滚动条

1.解决方案 在滚动元素上再包裹一个父元素&#xff0c;然后&#xff0c;该元素添加如下代码&#xff1a; &#xff08;注&#xff1a;PC端浏览器滚动条为8px&#xff09;使元素偏移原来位置8px&#xff0c;目的就是将滚动条区域移动到父元素边框外面&#xff0c;然后&#xff…

PFA试剂瓶——实验室存储运输化学试剂样品容器

PFA是一种高性能的塑料材料。它是一种热塑性塑料&#xff0c;由全氟化&#xff0c;聚合物制成&#xff0c;具有高度的化学稳定性性。由于其优异的性能&#xff0c;PFA被广泛应用于多个领域&#xff0c;尤其是作为存储和运输各种化学试剂的容器&#xff0c;耐受-200℃至260C的温…

云流量回溯的工作原理及关键功能

云计算和网络技术的快速发展为企业提供了更灵活、高效的业务运营环境&#xff0c;同时也引发了一系列网络安全挑战。在这个背景下&#xff0c;云流量回溯成为网络安全领域的一个关键技术&#xff0c;为企业提供了对网络活动的深入洞察和实时响应的能力。 一、 云流量回溯的基本…

UTONMOS:探索元宇宙,开启未来游戏新篇章

在元宇宙的世界里&#xff0c;游戏不再只是消遣&#xff0c;而是一个全新的互动世界&#xff0c;等待你来探索&#xff01; 逼真的虚拟现实技术&#xff0c;让你沉浸在充满想象力的游戏世界中&#xff0c;体验前所未有的刺激和乐趣。 与来自全球的玩家互动交流&#xff0c;结…

CodeWave智能开发平台--03--目标:应用创建--09供应商详情页面下

摘要 本文是网易数帆CodeWave智能开发平台系列的第13篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成09供应商详情页面下主营产品展示及权限管理 CodeWave智能开发平台的13次接触 CodeWave参考资源…

国标28181平台的手机视频监控客户端的电子地图功能对比

目 录 一、手机客户端 1、概述 2、具体功能简述 二、电子地图功能 1、经纬度定位 2、附近设备 3、实时浏览功能 4、录像回放 5、缩放功能 三、手机web客户端和CS客户端上的电子地图功能对比 1、对比表 2、测距&#xff08;PC客户端功能&#xff09; 3…

2. Presto应用

该笔记来源于网络&#xff0c;仅用于搜索学习&#xff0c;不保证所有内容正确。文章目录 1、Presto安装使用2、事件分析3、漏斗分析4、漏斗分析UDAF开发开发UDF插件开发UDAF插件 5、漏斗测试 1、Presto安装使用 参考官方文档&#xff1a;https://prestodb.io/docs/current/ P…

MySQL的三种存储引擎 InnoDB、MyISAM、Memory

InnoDB 1). 介绍 InnoDB是一种兼顾高可靠性和高性能的通用存储引擎&#xff0c;在 MySQL 5.5 之后&#xff0c;InnoDB是默认的MySQL 存储引擎。 2). 特点 DML操作遵循ACID模型&#xff0c;支持事务&#xff1b; 行级锁&#xff0c;提高并发访问性能&#xff1b; 支持外键F…

Python爬虫—requests模块简单应用

Python爬虫—requests模块简介 requests的作用与安装 作用&#xff1a;发送网络请求&#xff0c;返回响应数据 安装&#xff1a;pip install requests requests模块发送简单的get请求、获取响应 需求&#xff1a;通过requests向百度首页发送请求&#xff0c;获取百度首页的…

Visual Studio Code 连接远程服务器方法

1、输入用户名和服务器ip连接远程服务器 2、选择配置文件 配置文件路径&#xff1a;C:\Users\Administrator\.ssh\config config的内容大致如下&#xff1a; Host 192.168.134.3HostName 192.168.134.3User zhangshanHost 192.168.134.3HostName 192.168.134.3User lisiHost…

Java中异常处理-详解

异常&#xff08;Exception&#xff09; JVM 默认处理方案 把异常的名称&#xff0c;异常的原因&#xff0c;及异常出错的位置等信息输出在控制台程序停止执行 异常类型 编译时异常必须显示处理&#xff0c;否则程序会发生错误&#xff0c;无法通过编译运行时异常无需显示处理…

干货|移动端App自动化之触屏操作自动化

工作中我们经常需要对应用的页面进行手势操作&#xff0c;比如滑动、长按、拖动等&#xff0c;AppiumDriver 为我们提供一个模拟手势操作的辅助类 TouchAction&#xff0c;可以通过它对手机屏幕进行手势操作。 具体用法参见链接&#xff1a;chromedriver下载地址与webview自动化…

C语言入门教程,C语言学习教程(第三部分:C语言变量和数据类型)一

第三部分&#xff1a;C语言变量和数据类型 本章也是C语言的基础知识&#xff0c;主要讲解变量、数据类型以及运算符&#xff0c;这其中涉及到了数据的存储格式以及不同进制。 一、大话C语言变量和数据类型 在《数据在内存中的存储&#xff08;二进制形式存储&#xff09;》一…

el-form中一个el-form-item需要规则校验多个input

我的数据的格式&#xff1a; formData: {ipAddress: {one: ,two: ,}, }, 代码结构&#xff1a; <el-form-item label"IP地址" prop"ipAddress"><el-input-numberv-model"formData.ipAddress.one"class"ip-address":contro…

松木和桉木建筑模板:它们的性能和用途有何区别?

在建筑行业中&#xff0c;选择合适的模板材料对于保证施工质量和效率至关重要。松木和桉木是两种常用的建筑模板材料&#xff0c;它们各有特点和优势。特别是桉木&#xff0c;在某些方面相比松木有显著的优势。 松木建筑模板的特点 松木因其广泛的可用性和经济性而被广泛应用…

抛弃安卓,追赶iOS,鸿蒙能否成为中国第二大系统?

据半导体行业观察机构Techinsights发布报告预测&#xff0c;从2024年起&#xff0c;鸿蒙Harmony OS将取代苹果iOS&#xff0c;成为中国市场上第二大智能手机操作系统。 鸿蒙系统&#xff0c;支棱起来了&#xff01;去年&#xff0c;华为前脚“复活”麒麟芯片&#xff0c;后脚宣…