九爷带你了解 2017年3-4月企业面试题总结

简介:                                                    2017年3-4月企业面试题总结  一、Linux操作系统知识    1.


 

                                                  2017年3-4月企业面试题总结





wKioL1j8Ut6yaqZ9AABVsHK_Uok898.jpg-wh_50




  一、Linux操作系统知识


    1.常见的Linux发行版本都有什么?你最擅长哪一个?它的官网网站是什么?说明你擅长哪一块?
    答:
    常见的Linux发现版本有Redhat、Centos、Debian、Ubuntu、Suse
    最擅长Redhat和Centos
    Redhat官网:www.redhat.com
    Centos官网:www.centos.org
    我最擅长Linux基本命令操作及相关服务搭建
    2.Linux开机启动流程详细步骤是什么?系统安装完,忘记密码如何破解?
    答:
    开机步骤由a--h
    a、首先是bios加电自检、初始化,这个过程会检测相关硬件(cpu、内存、显卡、硬盘等),然后读取一个启动顺序,以硬盘为例,会读取硬盘中的MBR。
    b、加载内核读取/boot里边的配置文件。
    c、启动初始化进程,开始运行/sbin/init
    d、读取/etc/inittab确定运行级别
    e、根据/etc/rc.d/rcN.d加载开机启动程序,rcN.d都是链接文件,都指向/etc/rc.d/init.d再运行/etc/rc.d/rc.local
    f、用户登录(3种方式ssh、命令行、图形化)
    g、进入loginshell,以命令行为例,首先读取/etc/profile这个全局配置文件,然后再针对当前用户读取家目录中的 ~/.bash_profile和~/.bash_login和~/.profile
    h、最后一步就是打开non-loginshell,进入图形化后手动新建一个终端,但这个shell不读取/etc/profile
    忘记密码
    a、重启系统,在GRUB界面,选取忘记密码的系统,按e键进入编辑模式
    b、选项Kernel.....按e键进行编辑
    c、在编辑界面rhgbquiet后加空格,然后输入"single"或"1"回车
    d、按b启动进入单用户模式
    f、进入系统后passwd回车输入新密码(如果有selinux,先暂时关闭setenforce0)
    3.企业中Linux服务器系统分区标准是什么?(硬盘为300G,内存16G)
    答:
    /boot200M
    /swap16G
    /70G
    /data剩下的全部空间
    4.某一天突然发现Linux系统文件只读,该怎么办呢?完整操作步骤。
    答:
    首先把系统关机,然后以光盘启动进入救援模式(linuxrescue),执行"fsck.ext3-y/dev/sda2"(假如只读的分区类型为ext3,分区为/dev/sda2)
    5.安装一台系统使用DVD光盘安装,如何安装50台Linux系统如何安装呢?思考一下。
    答:
    a、可以多用几张DVD一台一台的安装。
    b、可以用Kickstart批量安装(客户端从网络启动)
    6.用虚拟机安装了一台Linux系统,突然想克隆一台服务器,克隆后发现无法上网,如何解决?
    答:
    a、编辑网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,将HWADDR和MAC地址这两行删除。
    b、修改文件/etc/udev/rules.d/70-persistent-net.rules,删除之前eth0所在的行,将下一行eth1修改为eth0
    c、reboot
    7.Linux网卡配置文件路径是什么?要使服务器上外网,必须满足的条件有哪些?需要配置什么?
    答:
    网卡配置文件路径:/etc/sysconfig/network-scripts/ifcfg-eth*(*代表数字)
    要上外网需要:能够链接internet的网线(或无线)、有网卡
    需要配置:IP、netmask、gateway、dns(自动或手动都ok,服务器一般自动)
    8.一般可以使用什么软件远程linux服务器?通过什么上传文件和下载文件?
    答:
    远程连接linux的软件:xshell、SecureCRT、putty、vnc(图形化)
    上传和下载文件:lrzsz、sftp
    9./mnt目录主要用于什么?/root目录跟root用户有什么关系?/根目录与/boot目录有什么联系?
    答:
    /mnt一般用于挂载外接设备
    /root是一个目录,是root用户的家目录
    /boot目录是/目录下的一个子目录
    10.某一天误操作,执行了rm-rf*,会有哪些情况发生?请举例。
    答:
    a、如果当前目录为"/tmp",那么这个目录下的东西会全部删除(默认不包含隐藏文件)
    b、如果当前目录为"/",那么系统上的数据将会丢失,且无法启动,系统崩溃(谨慎使用这个命令)
    二、Linux命令及文件操作
    1.在/tmp/目录下创建test.txt文件,内容为:Hello,World!,用一个命令写出来。
    答:
    echo"Hello,World!">/tmp/test.txt
    2.给test.txt文件除所有者之外增加执行权限,最终以数字写出文件的权限。
    答:
    655
    默认是644,可以通过"chmod655/tmp/test.txt"
    3.用vi命令编辑test.txt,如何跳转到末行,首行,行首、行末,如何在光标行下一行插入,如何复制5行,删除10行,查找jingfeng的字符、把jingfeng替换为jfedu.net
    答:
    末行:G
    首行:gg
    行首:^(Shift+6)
    行尾:$(Shift+4)
    光标下插入一行:o
    复制5行:5yy
    删除10行:10dd
    替换::%s/jingfeng/jfedu.net/g
    4.查找linux系统下以txt结尾,30天没有修改的文件大小大于20K同时具有执行权限的文件并备份到/data/backup/目录下。
    答:
    find/-name*txt-mtime+30-typef-size+20k-perma=x-execcp{}/data/backup/\;
    5.当前test.txt所属的用户为root,组为abc,请将test.txt使拥有者为abc,组为root,写出命令。
    答:
    chownabc:roottest.txt
    6.如何修改Linux启动级别为字符模式并永久生效,如何临时、永久关闭selinux及防火墙,请分别写出操作方法。
    答:
    更改字符模式:修改/etc/inittab一行为id:3:initdefault:
    临时关闭selinnuxsetenforce0
    临时关闭防火墙iptables-F
    永久关闭selinux修改/etc/selinux/config一行为SELINUX=permissive
    永久关闭防火墙iptables-F;/etc/init.d/iptablessave
    7.每次开机在/tmp目录下创建一个当天的日期文件夹(提示:当前日期表示的方法为:`date+%Y%m%d`)
    答:
    echo"mkdir/tmp/`date+%Y%m%d`">>/etc/rc.d/rc.local
    8.如何查看文件内容,命令有哪些?查看文件第1行到3行,查看文件最后一行。
    答:
    查看文件内容:vim、cat、head、tail
    查看第1到行:head-3file
    查看最后一行:tail-1file
    9.查看linux服务器IP的命令,同时只显示包含ip所在的行打印出来。
    答:
    以eth0为例
    只打印所在的行:ifconfigeth0|grep"inetaddr:"
    只打印ip:ifconfigeth0|grep"inetaddr:"|awk-F:'{print$2}'|awk-F'''{print$1}'
    10.将普通用户test加入root组的命令是?
    答:
    usermod-Groottest
     

下面转载 http://yw666.blog.51cto.com            

                    

 1、写一个脚本查找最后创建时间是三天前,后缀是*.log的文件并删除

1

find .-ctime +3 -name '*.log' rm -rf

 

2、统计ip访问情况,要求分析nginx访问日志,找出访问页面数量在前十位的ip

1

cataccess.log | awk '{print $1}' uniq -c | sort -rn | head -10

 

3、使用tcpdump监听主机为192.168.1.1tcp端口为80的数据,同时将输出结果保存输出

tcpdump.log

1

tcpdump 'host 192.168.1.1 and port 80' > tcpdump.log

 

 

4、利用Python打印前一天的本地时间,格式为'2016-03-29 13:58:34'

1

time.strftime('%y-%m-%d%H:%M%:%S' time.locatime(time.time() -86400))

 

5、用Python‘123456’反转为‘654321’

1

‘123456’[::-1]

 

6、利用Python执行shell命令并取得返回结果

1

2

3

4

5

>>> import subprocess

>>> a=subprocess.popen('ls',shell=True,stdout=subprocoss.PIPE,

stderr=subprocess.PIPE)

>>>stdout,sterr = a.communicate()

>>>print stdout

 

8、请用Python继承process,并写一个并行执行的类,并写出使用过程。

1

2

3

4

5

6

7

8

9

10

11

12

import multiprocessing

import time

class ClockProcess(multiprocessing.Process):

    def __init__(self, interval):

        multiprocessing.Process.__init__(self)

        self.interval = interval

    def run(self):

        n = 5

        while n > 0:

            print("the time is {0}".format(time.ctime()))

            time.sleep(self.interval)

            n -= 1

 

9、有文件file1

a、请用shell查询file1 里面空行的所在行号

1

#awk '$0 ~ /^$/ {print NR}' file1

1

grep -n "^$" file1

b、编写ShellScript查询file1 abc结尾的行

1

grep "abc$" file1

1

sed -n '/abc$/ p' file1

c、打印出file1 文件第1 到第3

1

sed  -n '1,3p' file1

 

10、如何将本地80 端口的请求转发到8080 端口,当前主机IP 192.168.2.1

1

Iptables –t nat -A PREROUTING -d 192.168.2.1 -p tcp  –dport 80 -j REDIRECT --to 8080

 

11、在11 月份内,每天的早上6 点到12 点中,每隔2 小时执行一次/usr/bin/httpd.sh 怎么

实现

1

0 6-12/2 * 11 * /usr/bin/httpd.sh

 

12、编写个shell 脚本将/usr/local/test 目录下大于100K 的文件转移到/tmp目录下

1

find /usr/local/test -type f -size +100k -exec mv {} /tmp/

1

2

3

4

5

6

7

8

9

10

11

#!/bin/bash

filelist=$(ls  /usr/local/test -l | grep "^-" awk '{print $9}'

filepath="/usr/local/test"

for file in $filelist

do

    filesize=$(du -s $filepath$file |awk '{print $1}')

    if [ $filesize -gt 100]

    then

    mv $filepath$file /tmp/

fi

done

 

13、简述raid0 raid1 raid5 三种工作模式的工作原理及特点。

1

2

RAID 0:带区卷,连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余,

RAID 0 只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据。因此,RAID 0 不能应用于数据安全性要求高的场合。

 

1

2

RAID 1:镜像卷,它是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据,不能提升写数据效率。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID

1 可以提高读取性能。RAID 1 是磁盘阵列中单位成本最高的,镜像卷可用容量为总容量的1/2,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。

       

1

RAID5:至少由3块硬盘组成,分布式奇偶校验的独立磁盘结构,它的奇偶校验码存在于所有磁盘上,任何一个硬盘损坏,都可以根据其它硬盘上的校验位来重建损坏的数据(最多允许1块硬盘损坏)。所以raid5可以实现数据冗余,确保数据的安全性,同时raid5也可以提升数据的读写性能。

 

 

14oracle 数据库备份方式

1

2

3

4

5

6

7

从物理与逻辑的角度分类:

物理备份:对数据库操作系统的物理文件(如数据文件、控制文件、日志文件等)的备份,物理备份又分为冷备份和热备份,前者是在关闭数据库的时候进行的,后者对正以归档日志方式进行的数据库备份,可以使用RMAN进行数据库的物理备份

逻辑备份:对数据库逻辑组件(如表、表空间、存储过程等数据库对象)的备份逻辑备份的手段很多,如exp、数据泵expdp、数据库闪回技术等

从数据库的备份策略角度分类:

完全备份:每次对数据库进行完整备份

增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。

差异备份:备份那些自从上次完全备份之后被修改过的文件。

 

15、如何查看占用端口8080 的进程

1

2

3

netstat -anpt | grep 8080

 lsof -i :8080

八、请写出apache2.X 版本的两种工作模式,以及各自工作原理。如何查看apache 当前所支持的模块,并且查看是工作在哪种模式下?

1

2

3

4

5

6

7

8

prefork(多进程,每个子进程产生一个线程)和worker(多进程多线程,每个进程生成多个线程)

  其主要工作方式是:当Apache服务器启动后,mpm_prefork模块会预先创建多个子进程(默认为5个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将超过预先创建的子进程数时,mpm_prefork模块就会创建新的子进程来处理额外的请求。Apache总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户端的请求就不需要在接收后等候子进程的产生。

由于在mpm_prefork模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他两种模块而言较多。不过mpm_prefork模块的优点在于它的每个子进程都会独立处理对应的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork在效率上要比Worker要高,但是内存使用大得多不擅长处理高并发的场景。

  Worker模式(多线程多进程):

和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。

总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。

可以通过命令httpd  -M  或 httpd -l 可以查看apache 当前的模块

可以通过命令httpd  -V查看是工作在哪种模式下

 

 

16、你使用过监控软件吗?说说其特点

1

2

3

4

5

6

7

8

使用nagios对服务器进行监控,其特点侧重于对检测项的状态监控,主要通过nrpe实现对远程主机的监控,但也可以通过snmp对设备(如路由器、交换机)进行监控,可实时实现手机短信、电子邮件、MSN、飞信报警。

使用cacti 对服务器进行监控,其特点侧重性能和流量监控并通过图表显示,主要通过snmp协议收集监测项数据,可实时实现手机短信、电子邮件、

使用zabbix对服务器进行监控,zabbix是完全开源的工具,整合了cacti和nagios等特性。

zabbix可以对主机的性能监控、网络设备性能监控、数据库、FTP 等通用协议监控、多种告警方式、详细的报表图表绘制

支持自动发现网络设备和服务器(可以通过配置自动发现服务器规则来实现)

支持分布式,能集中展示、管理分布式的监控点,扩展性强

可以自己开发完善各类监控(根据相关接口编写程序实现),编写插件容易,可以自定义监控项,报警级别的设置。

数据收集,支持 snmp(包括 trapping and polling ),IPMI,JMX,SSH,TELNET;

 

17、你对现在运维工程师的理解和以及对其工作的认识

1

运维工程师在公司当中责任重大,需要保证时刻为公司及客户提供最高、最快、最稳定、最安全的服务。运维工程师的一个小小的失误,很有可能会对公司及客户造成重大损失,因此运维工程师的工作需要严谨及富有创新精神。

 

18、第一部分 基础题 

a. 仅列出 /test目录下的所有目录,请写出完整命令

1

ls /test -l | grep "^d"

b. umask 022 ,请描述该命令的含义

1

umask设置文件或目录的缺省权限,umask 022表示目录的缺省权限为755,文件的缺省权限为644

c. 在排除 /test/a目录的条件下,归档并gzip压缩整个/test目录,请写出完整的操作命令t

1

tar zcvf backup.tar.gz --exclude /test/a /test

d. 查询并列出 test进程所打开的当前所有文件,请写出完整的操作命令

1

lsof -c test

e. 查询并列出test.rpm包里所包含的所有文件,请写出完整的操作命令

1

2

rpm -qpl

  test.rpm

f. /test/a目录建立软链接到 /test/b目录,请写出完整的操作命令

1

ln -s /test/a test/b

g. 设置当前用户环境中 test变量为 123并使之立即生效,请写出完整操作命令

1

export test=123

h. 设置系统当前运行级别中 test服务状态为启动时自动加载,请写出完整操作命令

假设运行级别为3级别

1

chkconfig  --level  3  test  on

k. 列出当前系统中所有的网络连接(包含进程名),请写出完整操作命令

1

2

3

4

5

6

7

8

9

netstat -antuple

(-a 显示所有socket,包括正在监听的。

  -n 以网络IP地址代替名称,显示出网络连接情形。

  -t 显示TCP协议的连接情况

  -u 显示UDP协议的连接情况。

  -p 显示指定协议信息。

    -l或--listening 显示监控中的服务器的Socket。

  -e 显示以太网统计。此选项可以与 -s 选项结合使用。

j. 实时抓取并显示当前系统中tcp 80端口的网络数据信息,请写出完整操作命令

1

tcpdump -nn tcp port 80

 

 

19、第二部分综合应用
a. 请写出5个你常用的系统或网络维护工具的名称

1

2

3

4

5

rhel  centos  ubuntu

iotop用于检查 I/O 的使用情况

htop实质上是 top 的一个增强版本。它更容易对进程排序。

ping

traceroute

b.nslookup使用中,请问如何查看test.com域中的MX记录

1

2

3

4

5

6

7

#nslookup

>set type=mx

>test.comc. ftp ssh,smtp,pop3,https,请写出这些服务的默认端口ftp:21

ssh:22

smtp:25

pop3:110

https:443.25G)

d. 请问如何用iptables工具阻断来自 192.168.0.1的所有网络连接

1

iptable -I INPUT -s 192.168.0.1 -j DROP

e. 请简要描述Linux系统下源代码编译方式安装软件的大致步骤

1

2

3

4

5

tar释放源码包

cd 切换到解压目录

./configure 配置

make 编译

make  install  安装

f. 请写出Tomcat程序的主配置文件名

1

server.xml

g. Mysql客户端工具中,请问如何查询当前所有的连接进程信息

1

2

mysql -u user -p password

-e "show processlist"

 

 

20. 服务器开不了机怎么解决一步步的排查

1

2

3

硬件有无报警灯提示

主面板液晶面板有没有提示什么报错信息,例如raid错误的提示信息

先排除硬件还是软件问题

十四. Linux开机模式

1

2

0 - 表示关闭系统(千万不要把默认设置成0哦!)1 - 单用户模式2 - 多用户模式,没有NFS服务3 - 多用户文本模式5 - 图形模式6 - 系统重新启动

过修改/etc/inittab,使系统在启动时进入不同模式。

 

 

21. Linux系统中病毒怎么解决

1

2

3

4

5

找到病毒文件然后删除;中毒之后一般机器cpu、内存使用率会比较高,机器向外发包等异常情况,排查方法:

linux服务器流量剧增,用iftop查看有连接外网的情况。netstat连接的外网ip和端口。#top命令找到cpu使用率高的进程,一般病毒文件命名都比较乱#可以用ps aux 查看是否有不明进程,找出病毒文件的位置#rm

-f 命令删除病毒文件#检查计划任务、开机启动项和病毒文件目录有无其他可疑文件等

chkconfig    --list     |  grep  3:on

服务器启动级别是3的,检查一下了开机启动项,没有特别明显的服务。然后检查了一下开机启动的一个文件,more   /etc/rc.local

 

22. 发现一个病毒文件你删了他又自动创建怎么解决

1

2

ps axu一个个排查,方法是查看可疑的用户和系统相似而又不是的进程找出进程可疑。

杀掉所有与病毒相关的进程,然后删掉病毒这个可执行文件,最后删除病毒创建的文件

十七. 日志文件很大,怎么把他们切分

1

2

3

4

5

6

7

8

9

针对这些日志按每或每周进行分割,例如只保留一周的数据,用logrotate来实现日志的轮替。或者编写日志文件大小监控脚本,定期检查该日志文件的大小,接近设定大小时,进行轮换。

如果日志文件存在并且很大,可以用Linux下的split进行文件分割:

模式一:指定分割后文件行数

Split:按指定的行数截断文件格式: split [-n] file [name]参数说明:-n: 指定截断的每一文件的长度,不指定缺省为1000行file: 要截断的文件name: 截断后产生的文件的文件名的开头字母,不指定,缺省为x,即截断后产生的文件的文件名为xaa,xab....直到xzz

  

模式二:指定分割后文件大小

命令:split -b 10m server.log server_part_

其中server.log是要分割的文件,server_part_是分割文件的前缀。

对二进制文件我们同样也可以按文件大小来分隔

 

 

23. tcp/ip七层模型

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

应用层 (Application):

网络服务与最终用户的一个接口。

协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

表示层(Presentation Layer):

数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)

格式有,JPEG、ASCll、DECOIC、加密格式等

会话层(Session Layer):

建立、管理、终止会话。(在五层模型里面已经合并到了应用层)

对应主机进程,指本地主机与远程主机正在进行的会话

传输层 (Transport):

定义传输数据的协议端口号,以及流控和差错校验。

协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层

网络层 (Network):

进行逻辑地址寻址,实现不同网络之间的路径选择。

协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP

数据链路层 (Link):

建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议)

将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。

物理层(Physical Layer):

 

24. 你常用的Nginx模块,用来做什么

1

2

3

4

5

6

7

rewrite模块,实现重写功能

access模块:来源控制

ssl模块:安全加密

ngx_http_gzip_module:网络传输压缩模块

ngx_http_proxy_module 模块实现代理

ngx_http_upstream_module模块实现定义后端服务器列表

ngx_cache_purge实现缓存清除功能

 

25、请列出你了解的web服务器负载架构。

1

2

3

4

Nginx

haproxy

keepalived

lvs

 


 

 

 


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7月前
|
SQL 算法 关系型数据库
python技术面试题(十九)--腾讯
python技术面试题(十九)--腾讯
|
7月前
|
设计模式 负载均衡 安全
|
7月前
|
设计模式 算法 关系型数据库
|
8月前
|
算法 Dubbo Java
Java开发5年,复习1个月成功上岸京东物流,面试和复习思路分享
最近有很多小伙伴在后台私信我说,马上金九银十了,现在准备跳槽涨薪的同学越来越多了,想要一些速成的面试题和面试技巧,特地今天马老师为大家整理了这三套阿里巴巴2022年全年Java岗面试题总结+一线互联网大厂Java岗面经+一线互联网大厂Java岗面试题总结!
|
7月前
|
前端开发 搜索推荐 PHP
|
机器学习/深度学习 算法
开篇 | 算法-从菜鸟开始
本文是《算法-从菜鸟开始》系列文章的开篇,欢迎收藏、留言、点赞。
110 0
|
存储 缓存 前端开发
2022金三银四前端面试题预告
2022金三银四前端面试题预告
376 0
|
设计模式 NoSQL 关系型数据库
阿里面试官三年经验PHP知识点汇总,学会你就是下一个阿里人
  1. PHP方面的问题   什么是composer?以及composer是干什么用的?工作原理PHP如何实现静态化你了解设计模式吗?说下你最常用的设计模式观察者模式是如何实现的?工厂模式是如何实现的?适配器模式是如何实现的?……PHP的优化方案说下你了解的session和cookie如何实现不基于session和cookie的用户认证。说下你目前框架所用到的核心概念什么是CSRF攻击,XSS攻击?如何防范你了解RESTful API吗?说说干什么用的。设计的原则如果实现自动加载?不用composer如何实现?PSR-4是什么?   2. 数据库方面   你知道nosql吗?你用的n
115 0
|
前端开发 程序员
程序员如何写出技术好文?
程序员如何写出技术好文?
程序员如何写出技术好文?