Linux进程管理(命令)入门

进程是一个运行中的程序

进程查看

ps

能够查看当前终端下运行的进程

$ ps
    PID TTY          TIME CMD
  26305 pts/0    00:00:00 bash
  26312 pts/0    00:00:00 ps

PID即进程号,是进程的唯一标识(可以相当于主键?)

TTY是当前程序执行的终端,pts/0表示虚拟终端

TIME是进程运行的时间,参考价值不大

执行ps -ef可以查看不同终端下运行的进程

$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 08:57 ?        00:00:00 /sbin/init splash
root           2       0  0 08:57 ?        00:00:00 [kthreadd]
root           3       2  0 08:57 ?        00:00:00 [rcu_gp]
root           4       2  0 08:57 ?        00:00:00 [rcu_par_gp]
root           6       2  0 08:57 ?        00:00:00 [kworker/0:0H-events_highpri
root           7       2  0 08:57 ?        00:00:00 [kworker/0:1-events]
root           8       2  0 08:57 ?        00:00:00 [kworker/u32:0-i915]
root           9       2  0 08:57 ?        00:00:00 [mm_percpu_wq]
root          10       2  0 08:57 ?        00:00:00 [rcu_tasks_rude_]
root          11       2  0 08:57 ?        00:00:00 [rcu_tasks_trace]
root          12       2  0 08:57 ?        00:00:00 [ksoftirqd/0]
root          13       2  0 08:57 ?        00:00:00 [rcu_sched]
....

PPID表示父进程号

使用pf -eLf将能够显示线程(LWP就代表轻量级进程)

$ ps -eLf | more
UID          PID    PPID     LWP  C NLWP STIME TTY          TIME CMD
root           1       0       1  0    1 08:57 ?        00:00:01 /sbin/init splash
root           2       0       2  0    1 08:57 ?        00:00:00 [kthreadd]
root           3       2       3  0    1 08:57 ?        00:00:00 [rcu_gp]
root           4       2       4  0    1 08:57 ?        00:00:00 [rcu_par_gp]
root           6       2       6  0    1 08:57 ?        00:00:00 [kworker/0:0H-events_highpri]
root           7       2       7  0    1 08:57 ?        00:00:00 [kworker/0:1-events]
root           9       2       9  0    1 08:57 ?        00:00:00 [mm_percpu_wq]
....

pstree

查看进程的树形结构

$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─acpid
        ├─avahi-daemon───avahi-daemon
        ├─bluetoothd
        ├─colord───2*[{colord}]
        ├─containerd───27*[{containerd}]
        ├─cron
        ├─cups-browsed───2*[{cups-browsed}]
        ├─cupsd
        ├─2*[dbus-daemon]
        ├─dnsmasq
        ├─dockerd───21*[{dockerd}]
...

直观的看到进程的父子关系

top

该命令查看更详细的进程信息

top - 09:30:30 up 33 min,  1 user,  load average: 0.47, 0.49, 0.52
Tasks: 378 total,   1 running, 376 sleeping,   0 stopped,   1 zombie
%Cpu(s):  3.4 us,  1.6 sy,  0.0 ni, 95.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15867.7 total,   8841.9 free,   4085.5 used,   2940.2 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.  11027.0 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                         ...                                                                                                                                                                                                      
      1 root      20   0  168696  11616   8140 S   0.0   0.1   0:01.01 systemd                                                                                                                               
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd                                                                                                                                    
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                                                                                                                      
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                                                                                                                                  
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri                                                                                                                 
      7 root      20   0       0      0      0 I   0.0   0.0   0:00.34 kworker/0:1-mm_percpu_wq                                                                                                                    
      9 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq                                                                                                                                
     10 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_rude_                                                                                                                             
     11 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_trace                                                                                                                             
     12 root      20   0       0      0      0 S   0.0   0.0   0:00.06 ksoftirqd/0                                                                                                                                 
     13 root      20   0       0      0      0 I   0.0   0.0   0:03.11 rcu_sched                                                                                                                                   
     14 root      rt   0       0      0      0 S   0.0   0.0   0:00.01 migration/0                                                                                                                                 
     15 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/0                                                                                                                               
     16 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0
     ...

top输出的前几行信息代表系统信息

top - 09:30:30 up 33 min, 1 user, load average: 0.47, 0.49, 0.52

第一行数据相当于uptime命令输出。09:30:30是当前时间,up 33 min 是系统已经运行的时间,1 users表示当前有1个用户在登录,load average: 0.47, 0.49, 0.52 分别表示系统一分钟平均负载,5分钟平均负载,15分钟平均负载

按下一个数字1,可以查看每个逻辑CPU的使用率,16核就显示16个CPU:

%Cpu0  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  1.4 us,  1.0 sy,  0.0 ni, 97.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  8.5 us,  0.7 sy,  0.0 ni, 90.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  :  0.0 us,  0.7 sy,  0.3 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  0.0 us,  0.3 sy,  0.3 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  :  0.0 us,  1.7 sy,  0.0 ni, 98.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  :  0.3 us,  0.3 sy,  0.3 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu8  :  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu9  :  1.8 us,  1.4 sy,  0.0 ni, 96.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu10 :  2.3 us,  2.3 sy,  0.0 ni, 95.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu11 :  3.4 us,  6.4 sy,  0.0 ni, 90.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu12 :  7.2 us,  5.1 sy,  0.0 ni, 87.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu13 :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu14 :  0.7 us,  1.7 sy,  0.3 ni, 97.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu15 :  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

负载是用来衡量系统繁忙程度的,如果值为1的话,就表示满负载

Tasks: 378 total, 1 running, 376 sleeping, 0 stopped, 1 zombie

第二行的Tasks信息展示的系统运行的整体进程数量和状态信息。378 total 表示系统现在一共有378个用户进程,1 running 表示1个进程正在处于running状态,376 sleeping表示376个进程正处于sleeping状态,0 stopped 表示 0 个进程正处于stopped状态,1 zombie表示 有1个僵尸进程

%Cpu(s): 3.4 us, 1.6 sy, 0.0 ni, 95.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

第三行的%Cpu(s)表示的是总体CPU使用情况。

  • us user 表示用户态的CPU时间比例
  • sy system 表示内核态的CPU时间比例
  • ni nice 表示运行低优先级进程的CPU时间比例
  • id idle 表示空闲CPU时间比例
  • wa iowait 表示处于IO等待的CPU时间比例
  • hi hard interrupt 表示处理硬中断的CPU时间比例
  • si soft interrupt 表示处理软中断的CPU时间比例
  • st steal 表示当前系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间比例
MiB Mem :  15867.7 total,   8841.9 free,   4085.5 used,   2940.2 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.  11027.0 avail Mem 

第4,5行显示的是系统内存使用情况。单位是KiB。totol 表示总内存,free 表示没使用过的内容,used是已经使用的内存。buff表示用于读写磁盘缓存的内存,cache表示用于读写文件缓存的内存。avail表示可用的应用内存

Swap原理是把一块磁盘空间或者一个本地文件当成内存来使用。Swap total表示能用的swap总量,swap free表示剩余,used表示已经使用的。这三个值都为0表示系统关闭了swap功能,由于演示环境是一台虚拟机,虚拟机一般都关闭swap功能

进程的控制命令

调整进程优先级

首先编写测试用的shell脚本test.sh

#!/bin/bash

echo $$  #打印PID

while :
do
	:
done

运行该程序 ./test.sh:

$ ./test.sh
15889

使用top -p 15889 查看进程详细信息

top - 14:04:15 up  5:06,  1 user,  load average: 0.83, 0.51, 0.33
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  6.4 us,  0.2 sy,  0.0 ni, 93.3 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15867.7 total,    730.2 free,   9453.5 used,   5684.0 buff/cache
MiB Swap:   2048.0 total,   1922.2 free,    125.8 used.   5519.4 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                                              
  15889 hwx       20   0   12576   3560   3332 R  99.7   0.0   0:57.58 bash                   

PR代表系统优先级,NI代表默认启动级别,即NICE值

使用nice命令,更改启动级别

$ nice -n 10 ./test.sh
17488

现在使用top命令查看,发现已经NI值已经被修改

使用renice可以修改运行中的程序的优先级

$ renice -n 15 17488
17488 (process ID) old priority 10, new priority 15

运行时末尾加上&可以将程序挂到后台运行,使其不会独占终端的交互:

$ ./test.sh &
[1] 17773

此时使用top指令依然可以查看到该进程处于运行状态

使用jobs可以查看在后台运行的程序:

$ jobs 
[1]+  Running                 ./test.sh &

使用fg命令可以将其调回到前台

$ fg 1
./test.sh

使用ctrl+Z可以将进程调到后台,并停止,将其置于挂起状态

$ fg 1
./test.sh
^Z
[1]+  Stopped                 ./test.sh

使用bg命令可以将其挂到后台继续运行

进程的通信方式

kill命令可用于向进程发送信号,使用kill -l可以显示能够发送的所有信号:

$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

2号信号就是常常使用的Ctrl+C,表示通知前台进程组终止进程

9号信号表示立即结束程序,不会被阻塞 使用kill -9 pid即可杀死pid对应的进程

守护进程与系统日志

守护进程和一般的进程有所区别,英文中称其为"daemon",即精灵,具有如下特点:

  • 是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或循环等待处理某些事件的发生
  • 一般在系统启动时开始运行,除非强行终止,否则直到系统关机才随之一起停止运行
  • 一般都以root用户权限运行,因为要使用某些特殊的端口或者资源
  • 父进程一般都是init进程,因为它真正的父进程在fork出守护进程后就直接退出了,所以守护进程都是孤儿进程,由1号接管

sshd就是一个守护进程,其父进程是1号进程,以root身份运行

# ps -ef | grep sshd
root        3151       1  0 May04 ?        00:00:50 /usr/sbin/sshd 

进入proc目录,以文件操作查看该进程的一些属性

# ls -l fd
total 0
lr-x------ 1 root root 64 Jul  4 13:24 0 -> /dev/null
lrwx------ 1 root root 64 Jul  4 13:24 1 -> 'socket:[28795]'
lrwx------ 1 root root 64 Jul  4 13:24 2 -> 'socket:[28795]'
lr-x------ 1 root root 64 Jul  4 13:24 3 -> '/var/lib/sss/mc/passwd (deleted)'
lrwx------ 1 root root 64 Jul  4 13:24 4 -> 'socket:[28800]'
lrwx------ 1 root root 64 Jul  4 13:24 5 -> 'socket:[28804]'

这里的1和2都指向socket描述符,1和2代表标准输出和错误输出,表示还进程会将其输出打印到日志文件里

系统日志一般存储在/var/log中,其中的messages是系统的常规日志文件

tail -f messages命令可以跟踪messages文件的状态,secure是安全日志,dmesg是内核启动日志,如下的cron是计划任务

# tail -f cron
Jul  4 15:54:01 VM-4-16-centos CROND[2009455]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
Jul  4 15:54:01 VM-4-16-centos CROND[2009464]: (root) CMD (/usr/local/sa/agent/secu-tcs-agent-mon-safe.sh > /dev/null 2>&1)
Jul  4 15:55:01 VM-4-16-centos CROND[2009680]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
...

服务管理工具

在Linux中,安装任何带有服务和守护进程的包,系统默认会把这些服务的初始化及systemd脚本添加进去,不过此时它们并没有被启用

service

启动脚本目录: /etc/init.d/,基本上都是bash脚本程序

管理指令: service 服务名 [start | stop | restart | reload | status]

examples:

查看所有服务当前的运行状态
service --status-all

查看指定服务(vsftpd)的运行状态
service vsftpd status

停止指定服务(vsftpd)
service vsftpd stop

重启网络服务
service network restart

服务程序运行级别:

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

使用chkconfig查看服务的运行级别:

# chkconfig --list

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

network         0:off   1:off   2:off   3:off   4:off   5:off   6:off

systemctl

启动脚本目录: /usr/lib/systemd/system/

常见操作: systemctl start|stop|restart|reload|enable|disable 服务名称

例如systemctl stop sshd.service就可以停止掉ssh服务

systemctl start sshd.service可以开启服务

enable可以使程序随着开机运行,disable则不会使程序随着开机运行

在system目录下,使用该命令查看所有运行级别

# ls -l runlevel*.target
lrwxrwxrwx 1 root root 15 Dec 22  2021 runlevel0.target -> poweroff.target
lrwxrwxrwx 1 root root 13 Dec 22  2021 runlevel1.target -> rescue.target
lrwxrwxrwx 1 root root 17 Dec 22  2021 runlevel2.target -> multi-user.target
lrwxrwxrwx 1 root root 17 Dec 22  2021 runlevel3.target -> multi-user.target
lrwxrwxrwx 1 root root 17 Dec 22  2021 runlevel4.target -> multi-user.target
lrwxrwxrwx 1 root root 16 Dec 22  2021 runlevel5.target -> graphical.target
lrwxrwxrwx 1 root root 13 Dec 22  2021 runlevel6.target -> reboot.target

查看运行级别:

# systemctl get-default
multi-user.target

.service文件

在system目录下,查看.service文件就可以得知服务的一些信息,例如查看sshd的service文件

# cat sshd.service 
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target

[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

含义解释如下:

[Unit]字段

主要给出服务描述、启动顺序和依赖关系

Description:当前服务的简单描述
Documentation:服务文档
After和Before:表示启动顺序,不涉及依赖关系。Before=xxx.service表示本服务在xxx.service 启动之前启动,After=yyy.service表示本服务在yyy.service 之后启动
Wants:表示该服务和某服务存在某种弱依赖关系,即某服务停止运行或退出不影响该服务继续运行
Requires:表示”强依赖”关系,即某服务停止运行或退出,改服务也必须停止运行
Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的

[Service]字段

服务的启动行为以及如何启动、重启、停止等信息

Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
PIDFile:pid文件路径

ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。ExecReload:指定单元停止时执行的命令或者脚本。

ExecStop:指定单元停止时执行的命令或者脚本。

PrivateTmp:True表示给服务分配独立的临时空间

Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。

RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。

User字段可以设置服务的用户名

WorkingDirectory字段指定服务的安装目录

[Install]字段

如何安装这个配置文件,即怎样做到开机自启

Alias:为单元提供一个空间分离的附加名字
RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息
Also:指出和单元一起安装或者被协助的单元
DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例
WantedBy字段:表示该服务所在的 Target
Target的含义是服务组,表示一组服务
WantedBy=multi-user.target指的是服务所在的Target是multi-user.target

Systemd 有默认的启动 Target就是multi-user.target,在这个组里的所有服务,都将开机启动

SELinux简介

SELinux是安全增强型Linux: What is SELinux?

传统的 Linux 系统安全,采用的是 DAC(自主访问控制方式),而 SELinux 是部署在 Linux 系统中的安全增强功能模块,它通过对进程和文件资源采用 MAC(强制访问控制方式)为 Linux 系统提供了改进的安全性,在支持SELinux的系统中,所有的进程都有一个SELinux的标签

输入getenforce查看SELinux的状态:

# getenforce
Disabled

查看SELinux配置信息

# cat /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

如果修改了这个文件,要求重启系统才能生效

使用setenforce可以临时修改配置信息

使用ps -Z可以显示进程的标签

# ps -Z
LABEL                               PID TTY          TIME CMD
-                               2026618 pts/2    00:00:00 bash
-                               2029090 pts/2    00:00:00 ps

诸多特性不再详细解释

posted @ 2022-07-04 17:38  N3ptune  阅读(736)  评论(0编辑  收藏  举报