歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> 學習Linux >> CentOS系統管理命令大全

CentOS系統管理命令大全

日期:2017/3/6 9:30:50   编辑:學習Linux

CentOS系統管理命令大全


CentOS系統管理命令大全


進程管理

進程管理簡介

進程是正在執行的一個程序或命令,每一個進程都是一個運行的屍體,都有自己的 地址空間,並占用一定的系統資源。

進程管理的作用

  • 判斷服務器健康狀態
  • 查看系統中所有進程
  • 殺死進程

進程的查看

查看所有進程

ps命令

  • ps aux 查看系統中所有進程,使用BSD操作系統格式
  • ps -le 查看系統中所有進程,使用Linux標准命令格式
    • 選項
      -a 顯示一個終端的所有進程,除了會話
      -u 顯示進程的歸屬用戶及內存的使用情況
      -x 顯示沒有控制終端的進程
      -l 長格式顯示。顯示更加詳細的信息
      -e 顯示所有進程和-A作用一致
/*  USER 進程由哪個用戶生成    PID 進程ID號    %CPU 進程占用CPU資源的百分比,占用越高,進程越耗資源    %MEM 進程占用物理內存的百分比,占用越高,進程越耗資源    VSZ 進程占用虛擬內存的大小,單位KB    RSS 進程占用實際物理內存的大小,單位KB    TTY 進程是在哪個終端中運行。        其中tty1-tty7代表本地控制台終端,tty1-tty6是本地字符界面終端,tty7是圖形終端,pts/0-255代表虛擬終端、遠程終端        tty1-tty7可以通過CTL+ALT+F1~CTL+ALT+F7來切換。        TTY顯示?說明進程是由內核啟動的不是由終端啟動。    STAT 進程狀態。        常見的狀態:        R 運行、S 睡眠、T 停止狀態、s 包含子進程、+ 位於後台    START 進程啟動時間    TIME 進程占用CPU的運算時間,注意不是系統時間    COMMAND 產生此進程的命令名*/$ ps auxUSER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot         1  0.0  0.4 185316  4116 ?        Ss   6月24   0:23 /sbin/init splroot         2  0.0  0.0      0     0 ?        S    6月24   0:00 [kthreadd]root         3  0.0  0.0      0     0 ?        S    6月24   4:07 [ksoftirqd/0]root         5  0.0  0.0      0     0 ?        S<   6月24   0:00 [kworker/0:0H]root         7  0.1  0.0      0     0 ?        S    6月24  16:09 [rcu_sched]...

pstree命令

  • pstree
    • 選項 -p 顯示進程的PID -u 顯示進程的所屬用戶
$ pstreesystemd─┬─ModemManager─┬─{gdbus}        │              └─{gmain}        ├─NetworkManager─┬─dhclient        │                ├─dnsmasq        │                ├─{gdbus}        │                └─{gmain}        ├─accounts-daemon─┬─{gdbus}        │                 └─{gmain}        ├─acpid        ├─5*[agetty]        ├─avahi-daemon───avahi-daemon        ├─colord─┬─{gdbus}...

top命令

查看系統健康狀態

  • top
    • 選項 -d 秒數 指定投票命令每隔幾秒更新。默認3秒 -b 使用批處理模式輸出。一般和-n選項合用 -n 次數 指定top命令指定的次數。一般和-b選項合用
  • 在top命令的交互模式當中可以執行的命令 ?或h 顯示交互模式的幫助 P 以CPU使用率排序,默認就是此項 M 以內存的使用率排序 N 以PID排序 q 退出top

第一行信息為任務隊列信息

內容說明12:26:46系統當前時間up 1 day, 13:32系統的運行時間,本機已經運行1天13小時32分鐘2 users當前登錄了兩個用戶load average: 0.00, 0.00, 0.00系統在之前1分鐘,5分鐘,15分鐘的平均負載。一般任務小於1時,負載較小。如果大於1,系統已經超出負載。

第二行為進程信息

內容說明Tasks: 95 tatal系統中進程總數1 running正在運行的進程數94 sleeping睡眠的進程0 stopped正在停止的進程0 zombie僵屍進程。如果不是0,需要手工檢查僵屍進程

注:

孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成為孤兒進程。孤兒進程將被init進程(進程號為1)所收養,並由init進程對它們完成狀態收集工作。

僵屍進程:一個進程使用fork創建子進程,如果子進程退出,而父進程並沒有調用wait或waitpid獲取子進程的狀態信息,那麼子進程的進程描述符仍然保存在系統中。這種進程稱之為僵死進程。

第三行行為CPU信息

內容說明Cpu(s): 0.1%us用戶模式占用的CPU百分比0.1%sy系統模式占用的CPU百分比0.0%ni改變過優先級的用戶進程占用的CPU百分比99.7%id空閒CPU的CPU百分比0.1%wa等待輸入/輸出的進程占用CPU百分比0.0%hi硬終端請求服務占用的CPU百分比0.1%si軟中斷請求服務占用的CPU百分比0.0%stst(Steal time)虛擬時間百分比。就是當有虛擬機時,虛擬CPU等待實際CPU的時間百分比

第四行行為物理內存信息

內容說明Mem: 625344k total物理內存的總量,單位KB571504k used已經使用的物理內存數量53840 free空閒的物理內存數量,我們使用虛擬機,總共只分配了628MB內存,所以只有53MB的空閒內存了65800k buffers作為緩沖的內存數量

注:

buffers:加速寫入;例如保存文件內容,真是情況是先寫入文件進程的緩沖區,然後在文件關閉和系統空閒時再寫入硬盤。

第五行為交換分區(swap)信息

內容說明Swap: 524280k total交換分區(虛擬內存)的總大小Ok used已經使用的交互分區的大小524280k free空閒交換分區的大小409289k cached作為緩存的交換分區的大小

注:

cached:加速讀取;例如,讀取硬盤文件時可以把部分文件放在內存中緩存起來,不用每次訪問硬盤,加速讀取文件速度。

top內容主要查看 load average、cpu的空閒率、內存的空閒、Swap分區的空閒。

// 更改top刷新時間為1s,但不建議,top本身耗費資源$ top -n 1// 使用top只能在終端中看到很少一部分程序,因此使用-b來保存進程到文件中$ top -b -n 1 >top.log$ cat top.log

進程的結束

kill命令

  • kill -l
    • 查看可用的進程信號
信號代號信號名稱說明1SIGHUB該信號讓進程立即關閉,然後重新讀取配置文件之後重啟2SIGINT程序終止信號,用於終止前台進程。相當於輸出ctl+c快捷鍵8SIGFPE在發生致命的算術運算錯誤時發出。不僅包括浮點運算錯誤,還包括溢出及除數為0等其他所有的算術的錯誤9SIGKILL用來立即結束程序的運行。本信號不能被阻塞、處理和忽略。一般用於強制終止進程。14SIGALRM時鐘定時信號,計算的是實際的時間或時鐘時間。alarm函數使用該信號15SIGTERM正常結束進程的信號,kill命令默認信號。有時如果進程已經發生問題,這個信號是無法正常終止進程的,我們才會嘗試SIGKILL信號,也就是信號9。18SIGCONT該信號可以讓暫停的進程恢復執行,本信號不能被阻塞。19SIGSTOP該信號可以暫停前台進程,相當於輸入ctl+z快捷鍵。本信號不能被阻斷。

SIGHUB信號 若apache服務器重新設置配置文件,需要重啟apache服務,如果使用服務命令stop、start時關閉服務造成用戶體驗非常差。那麼可以使用Kill -HUB pid的命令使apache服務重新加載配置實現平滑重啟。但apache服務有多個服務進程,那麼可以使用killall 命令實現。 平滑重啟不會使服務器登錄用戶掉線。

SIGKILL 強制終止進程,kill -9 2236

// 查看可用的進程信號$ kill -l// 強制終止進程,注kill後跟的是pid不能是進程名$ kill -9 2237

killall命令

  • killall [選項][信號]進程名
    • 選項 -i 交互式,詢問是否要殺死某個進程 -I 忽略進程名的大小寫
// 殺死所有apache服務$ killall -9 httpd

pkill命令

  • pkill [選項][信號]進程號
    • 選項 -t 終端號 按照終端號踢出用戶

注:pkill和killall命令基本相同。

// 查看當前登錄用戶$ w 19:53:45 up  3:02,  1 user,  load average: 0.00, 0.01, 0.05USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHATroot   tty1     -               16:51    3:02m 23.87s  0.23s -bashroot   pts/0    192.168.44.1    04:47    0.00s 0.22s   0.00s wroot   pts/0    192.168.44.1    04:47    0.00s 0.22s   0.00s -bash// 只有root用戶可以踢掉本地用戶# pkill -9 -t tty1

進程優先級的修改

進程優先級簡介

Linux操作系統是一個多用戶、多任務的操作系統,Linux系統中通知運行著非常多的進程。但是CPU在統一時鐘周期內只能運算一個指令。進程優先級決定了每個進程處理的先後順序。

$ ps -leF S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD4 S     0     1     0  0  80   0 - 29895 -      ?        00:00:02 systemd1 S     0     2     0  0  80   0 -     0 -      ?        00:00:00 kthreadd1 S     0     3     2  0  80   0 -     0 -      ?        00:00:00 ksoftirqd/01 S     0     5     2  0  60 -20 -     0 -      ?        00:00:00 kworker/0:0H1 S     0     7     2  0  80   0 -     0 -      ?        00:00:03 rcu_sched1 S     0     8     2  0  80   0 -     0 -      ?        00:00:00 rcu_bh1 S     0     9     2  0 -40   - -     0 -      ?        00:00:00 migration/05 S     0    10     2  0 -40   - -     0 -      ?        00:00:00 watchdog/05 S     0    11     2  0  80   0 -     0 -      ?        00:00:00 kdevtmpfs1 S     0    12     2  0  60 -20 -     0 -      ?        00:00:00 netns// PRI代表Priority,NI代表Nice。這兩個值都是優先級,數字越小代表該進程優先級越高。

修改NI值時有幾個注意事項

  • NI的值的范圍是-20到19
  • 普通用戶調整NI值的范圍是0到19,而且只能調整自己的進程
  • 普通用戶只能調高NI值,而不是降低,如原本NI值為0,則只能調整為大於0
  • root用戶才能設定進程NI值為負值,而且可以調整任何用戶的進程
  • PRI(最終值)=PRI(原始值)+NI
  • 用戶只能修改NI的值,不能直接修改PRI

nice命令

  • nice [選項] 命令 nice命令可以給新執行的命令直接賦予NI值,但是不能修改已經存在進程的NI值
    • 選項 -n NI值 給命令賦予NI值
// 進程啟動時才可以修改其NI值,進程運行時無法修改# nice -n -5 service httpd start

renice命令

  • renice [優先級] PID renice命令是修改已經存在進程的NI值命令
// 使用renice來修改已經存在進程的NI值# renice -10 2125

工作管理

工作管理簡介

工作管理是指在單個登錄終端中(也就是登錄的shell界面中)同時管理多個工作的行為。

注意事項

  • 當前的登錄終端,只能管理當前終端的工作,而不能管理其他登錄終端的工作

  • 放入後台的命令必須可以持續運行一段時間,這樣我們才能捕捉和操作這個工作

  • 放入後台執行的命令不能和前台有交互或需要前台輸入,否則放入後台只能暫停,而不能運行

工作管理方法

進程放入後台

  1. 使用 & 把命令放入後台
  2. 使用 ctrl + z快捷鍵把命令放入後台
// 把命令放入後台,並在後台執行$ tar -zcf etc.tar.gz /etc &// 按下ctl + z 快捷鍵,放在後台暫停$ topctl + z

查看後台的工作

  • jobs
    • 選項 -l 顯示工作的PID 注:”+”號代表最近一個放入後台的工作,也是工作回復時,默認回復的工作。”-“號代表倒數第二個放入後台的工作
$ top&$ top // ctrl+ z放入後台// 查看後台進程,兩個top進程都是停止的,因為top給前台用戶查看的,和前台有交互,無法在後台執行$ jobs[1]-  Stopped                 top[2]+  Stopped                 top$ vi abc &$ jobs[1]   Stopped                 top[2]-  Stopped                 top[3]+  Stopped                 vi abc

將後台暫停的工作恢復到前台執行

  • fg %工作號
    • 參數 %工作號 %號可以省略,但是注意工作和PID的區別

將後台暫停的工作恢復到後台執行

  • bg %工作號
    • 參數 %工作號 %號可以省略,但是注意工作和PID的區別

注:後台恢復執行的命令,是不能和前台有交互的,否則不能恢復到後台執行

後台命令脫離登錄終端執行

簡介

把命令放入後台,只能在當前登錄終端執行。一旦退出或關閉終端,後台程序就會停止。

後台命令脫離登錄終端執行的方法

  • 把需要後台執行的命令加入 /etc/rc.local文件
  • 使用系統定時任務,讓系統在指定的時間執行某個後台命令
  • 使用nohub命令,推薦使用
  • 做成daemon守護進程 如mysqld服務
// 系統啟動時執行rc.local文件$ cat /etc/rc.localtouch /var/lock/subsys/local // 注:這裡不是創建文件,改變文件的timestamp
// 在終端1中執行for.sh# vi for.sh#!/bin/bashfor ((i=0; i<=1000; i=i+1))    do        echo 11 >> /root/for.log        sleep 10    done# nohup /root/for.sh &// 關閉終端1// 打開終端2,ps aux 可以看到for.sh仍在運行

系統資源查看

vmstat命令監控系統資源

vmstat [刷新延時 刷新次數]

$ vmstat 1 3procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 0  0  70280 133280  13140 303244    0    4    60    16   53  121  1  1 98  0  0 0  0  70280 133264  13140 303248    0    0     0     0   40  201  1  0 99  0  0 0  0  70280 133264  13140 303248    0    0     0     0   43  183  1  0 99  0  0
  • process 進程信息字段 -r 等待運行的進程數,數量越大,系統越繁忙 -b 不可被喚醒的進程數量,數量越大,系統越繁忙
  • memory 內存信息字段 -swpd 虛擬內存的使用情況,單位KB -free 空閒的內存容量,單位KB -buff 緩沖的內存容量,單位KB -cache 緩沖的內存容量,單位KB
  • swap 交換分區的信息字段 -si 從磁盤中交換到內存中數據的數量,單位KB -so 從內從中交換到磁盤中數據的數量,單位KB。此兩個數越大,證明數據需要經常在磁盤和內存之間交換,系統性能越差。
  • io 磁盤讀寫信息字段 -bi 從塊設備讀入數據的總量,單位是塊 -bo 寫到塊設備的數據的總量,單位是塊。次兩個數越大,代表系統的I/O越繁忙。
  • system 系統信息字段 -in 每秒被中斷的進程次數 -cs 每秒中進行的時間切換次數。此兩個數越大,代表系統與接口設備的通信非常繁忙。
  • CPU CPU信息字段 -us 非內核進程消耗CPU運算時間的百分比 -sy 內核進程消耗CPU運算時間的百分比 -id 空閒CPU的百分比 -wa 等待I/O所消耗的CPU百分比 -st 被虛擬機所盜用的CPU占比

dmesg開機時內核檢測信息

$ dmesg |grep CPU

free命令查看內存使用狀態

  • free [-b|-k|-m|-g]
    • 選項 -b 以字節為單位顯示 -k 以KB為單位顯示,默認就是以KB為單位顯示 -m 以MB為單位顯示 -g 以GB為單位顯示
/*    total 總內存數    used 已經使用內存數    free 空閒的內存數    shared 多個進程共享的內存數    buffers 緩沖內存數    cached 緩存內存數    默認單位是KB*/$ free -m              total        used        free      shared  buff/cache   availableMem:            983         545         124           6         313         273       Swap:          1906          68        1838

查看CPU信息

$ cat /proc/cpuinfo

uptime命令

顯示系統的啟動時間和平均負載,也就是top命令的第一行。w命令也可以看到這個數據。

$ uptime 10:10:47 up  6:11,  1 user,  load average: 0.18, 0.10, 0.09$ w 10:11:35 up  6:12,  1 user,  load average: 0.09, 0.09, 0.09USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHATroot   tty7     :0               一16   17:20m 49.38s  0.28s /sbin/upstart --user

查看系統與內核相關信息

  • uname [選項]
    • 選項 -a 查看系統所有相關信息 -r 查看內核版本 -s 查看內核名稱

判斷當前系統的位數

  • file /bin/ls

查看當前Linux系統的發行版本

  • lsb_release -a

列出進程打開或使用的文件信息

  • lsof [選項] 列出進程調用或打開文件的信息
    • 選項 -c 字符串 只列出以字符串開頭的進程打開的文件 -u 用戶名 只列出某個用戶的進程打開的文件 -p pid 列出某個PID進程打開的文件
// 查詢系統中所有進程調用的文件$ lsof |more// 查詢某個文件被哪個進程調用$ lsof /sbin/init// 查看httpd進程調用了哪些文件$ lsof -c httpd// 按照用戶名,查詢某個用戶進程調用的文件$ lsof -u root

緩存和緩沖的區別 簡單來說緩存(cache)用來加速數據從硬盤中“讀取”的,而緩沖(buffer)用來加速數據“寫入”硬盤的。

系統定時任務

  • at一次性定時任務
  • crontab循環定時任務
  • 系統的crontab設置
  • anacron配置

at命令

確定at安裝

// at 服務是否安裝# chkconfig --list |grep atd# service atd status

at的訪問控制

  • 如果系統中有/etc/at.allow文件,那麼只有寫入/etc/at.allow文件(白名單)中的用戶可以使用at命令(/etc/at.deny文件會被忽略)

  • 如果系統中沒有/etc/at.allow文件,只有/etc/at.deny文件,那麼寫入/etc/at.deny文件(黑名單)中的用戶不能使用at命令。對root不起作用

  • 如果系統中這兩個文件都不存在,那麼只有root用戶可以使用at命令

at命令

at [選項] 時間 選項 -m 當at工作完成後,無論是否命令有輸出,都用email通知執行at命令的用戶 -c 工作號 顯示該at 工作的實際內容 時間: -HH:MM 例如:02:30 -HH:MM YYYY-MM-DD 例如:02:30 2013-07-25 -HH:MM [am|pm] [month] [date] 例如:02:30 July 25 -HH:MM [am|pm] + [minutes|hours|days|weeks] 例如:now + 5 minutes

例子

$ at now +2 minutesat> /root/hello.sh >> /root/hello.logat> <EOT>// 指定時間重啟$ at 02:00 2013-07-26at>/bin/syncat>/sbin/shutdown -r now

其他at管理命令

  • atq

    • 查詢當前服務器上的at工作
  • atrm [工作號]

    • 刪除指定的at任務

crontab

crond服務管理與訪問控制

// 檢查crond服務是否安裝啟動# service crond restart# chkconfig crond on

訪問控制

  • 當系統中有/etc/cron.allow文件時,只有寫入此文件的用戶可以使用crontab命令,沒有寫入的用戶不能使用crontab命令。同樣如果有此文件,/etc/cron.deny文件會被忽略,/etc/cron.allow文件的優先級更高

  • 當系統中只有/etc/cron.deny文件時,則寫入此文件的用戶不能使用crontab命令,沒有寫入文件的用戶可以使用crontab命令

用戶的crontab設置

  • crontab [選項]
    • 選項: -e 編輯crontab定時任務 -l 查詢crontab任務 -r 刪除當前用戶所有的crontab任務
// 編輯crontab命令$ crontab -e***** command
項目含義范圍第一個*一小時當中的第幾分鐘0-59第二個*一天當中的第幾小時0-23第三個*一個月當中的第幾天1-31第四個*一年當中的第幾個月1-12第五個*一周當中的星期幾0-7(0和7都代表星期日)特殊符號含義*代表任何時間。比如第一個“*”就代表一小時中的每分鐘都執行一次的意思,代表不連續的時間。比如“0 8,12,16 * * * 命令”,就代表每天的8點0分,12點0分,16點0分都執行一次命令-代表連續的時間范圍,比如“0 5 * * 1-6 命令”,代表在周一到周六凌晨5點0分執行命令*/n代表每隔多久執行一次。比如“ */10 * * * * 命令”,代表每隔10分鐘就執行一遍命令
// cron命令,每月1號和15號,每周1的0點0分都會執行// 注意:星期幾和幾號最好不要同時出現,他們定義的都是天。非常迷惑。0 0 1,15 * 1 命令// 例子// 每隔5分鐘在/root/test中寫入111*/5 * * * * echo 111 >> /root/test

crontab注意事項

  • 六個選項不能為空,必須填寫。如果不確定使用“*”代表任意時間。

  • crontab定時任務,最小有效時間是分鐘,最大時間范圍是月。想2018年某時執行,3點30分30秒這樣的時間都不能識別。

  • 在定義時間時,日期和星期最好不要在一條定時任務中出現,因為他們都是以天作為單位,飛鏟更容易讓管理員混亂。

  • 在定時任務中,不管是直接寫命令,還是在腳本中寫命令,最好都是用絕對路徑。

注:定時任務自帶的環境變量與$PATH中的保存的環境變量不一定相同,所以在crontab中使用絕對路徑。

系統定的crontab設置

“crontab -e”是每個用戶執行的命令,也就是說不同的用戶身份可以執行自己的定時任務。可是有些定時任務需要系統執行,這是我們就需要編輯/etc/crontab這個配置文件。

// 這裡crontab是普通用戶的定時任務$ crontab -e // 系統定時任務// CentOS 5 中的配置文件$ vim /etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/#run-parts01 * * * * root run-parts /etc/cron.hourly02 4 * * * root run-parts /etc/cron.daily22 4 * * 0 root run-parts /etc/cron.weekly42 4 1 * * root run-parts /etc/cron.monthly
// 查看/etc下crontab相關的目錄和文件# ls /etc/croncron.d/       cron.hourly/  crontab       cron.daily/   cron.monthly/ cron.weekly/  

執行系統的定時任務的方法

  • 手工執行定時任務

  • 系統定時任務

    • 第一種是把需要定時執行的腳本復制到/etc/cron.{daily, weekly, monthly}目錄中任意一個

    • 第二種是修改/etc/crontab配置文件

anacron配置

anacron是用來保證在系統關機的時候錯過的定時任務,可以在系統開機之後再執行

anacron檢測周期

  • anacron會使用一天,七天,一個月作為檢測周期

  • 在系統的/var/spool/anacron/目錄中存在cron.{daily, weekly, monthly}文件,用於記錄上次執行cron的時間

  • 和當前時間作比較,如果兩個時間的差值超過了anacron的指定時間差值,證明有cron任務沒有被執行

CentOS 6.x 的區別

  • 在老的CentOS版本中,/etc/cron.{daily, weekly, monthly}這些目錄即會被cron調用,也會被anacron調用,容易重復執行

  • 在CentOS 6.x中則只會被anacron調用,避免了重復執行

  • 在CentOS 6.x中,anacron不再是服務,而是系統命令

anacron配置文件

$ vi /etc/anacrontab# /etc/anacrontab: configuration file for anacron# See anacron(8) and anacrontab(5) for details.SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/binHOME=/rootLOGNAME=rootRANDOM_DELAY=45START_HOURS_RANGE=3-22# These replace cron's entries1       5       cron.daily      run-parts --report /etc/cron.daily7       10      cron.weekly     run-parts --report /etc/cron.weekly@monthly        15      cron.monthly    run-parts --report /etc/cron.monthly#天數    強制延遲(分鐘)    工作名稱    實際執行的命令

cron.daily工作來說明執行過程

  • 首先讀取/var/spool/anacron/cron.daily中上一次anacron執行的時間

  • 和當前時間比較,如果兩個時間差值超過1天,就執行cron.daily工作

  • 執行這個工作只能在03:00-22:00之間

  • 執行工作時強制延遲時間為5分鐘,再隨機延遲0-45分鐘時間

  • 使用nice命令指定默認優先級,使用run-parts腳本執行/etc/cron.daily目錄中所有可執行文件

http://xxxxxx/Linuxjc/1141691.html TechArticle

Copyright © Linux教程網 All Rights Reserved