閱讀前須知!
-
深入理解Linux第二章系統管理篇 -
本篇主要內容包括 Shell 基本命令、檔案目錄管理、軟體包管理、磁盤管理、用戶與用戶組管理、行程管理等,通過本篇內容的學習,小伙伴們可以掌握Linux系統設定基礎內容,并能應對日常的Linux系統問題,
-
文章內容純手敲,有異或錯別字歡迎大家評論區指出!
-
命令居多希望大家下去多練習!
-
更多精彩內容還請訪問:https://blog.csdn.net/weixin_45692705?spm=1011.2124.3001.5343

重要:為了更好的深入學習,請各位小伙伴務必按照以下序號進行閱讀
| 序號 | 標題 |
|---|---|
| 1 | Linux基礎,系統概敘與虛擬機搭建+CentOS系統安裝(建議收藏) |
深入理解Linux第二章系統管理篇目錄
- 閱讀前須知!
- 一.Shell基本命令
- 1.Shell簡介
- 2.約定
- 3.快速上手,瀏覽你的硬碟
- 4.提高效率,使用命令列補全和通配符
- 5.查看目錄和檔案
- 顯示當前目錄:pwd
- 改變目錄:cd
- 列出目錄內容:ls
- 列出目錄內容:dir和vdir
- 查看文本檔案:cat和more
- 閱讀檔案的開頭和結尾:head和tail
- 更好的文本閱讀工具:less
- 查找檔案內容:grep
- 指定目錄下查找檔案:find
- 快速定位檔案:locate
- 查找特定程式:whereis
- 用戶及版本資訊查看:who
- 尋求幫助:man
- 獲取命令簡介:whatis和apropos
- 二.檔案目錄管理
- 1.Linux 檔案系統的架構
- 2.共享檔案
- 3.建立檔案和目錄
- 建立目錄:mkdir
- 建立一個空檔案:touch
- 4.移動 復制和洗掉
- 移動和重命名:mv
- 復制檔案和目錄:cp
- 洗掉目錄和檔案:rmdir和rm
- 5.檔案和目錄的權限
- 權限設定針對的用戶
- 需要設定那些權限
- 查看檔案和目錄的屬性
- 改變檔案所有權:chown和chgrp
- 改變檔案權限:chmod
- 檔案權限的八進制表示
- 6.檔案型別
- 查看檔案型別
- 建立鏈接:ln
- 7.輸入輸出重定向和管道
- 輸出重定向
- 輸入重定向
- 管道
- 三.軟體包管理
- 1.rmp包的由來
- 2.操作rmp包
- 查詢所安裝的所有rpm軟體包
- rpm安裝命令
- rpm卸載命令
- 3.什么是yum
- 4.yum和rpm的區別在哪里
- 5.yum倉庫配置
- 配置國內源
- 安裝測驗
- 6.壓縮工具
- 壓縮檔案:gzip
- 更高的壓縮率:bzip2
- 支持rar格式
- 四.用戶與用戶組管理
- 1.為朋友 John 添加賬戶
- 2.添加用戶
- 使用命令列工具:useradd 和 groupadd
- 記錄用戶操作:history
- 直接編輯 passwd 和 shadow檔案
- 3.洗掉用戶:userdel
- 4.管理用戶賬號:usermod
- 5.查看用戶資訊:id
- 6.用戶間切換:su
- 五.行程管理
- 1.結束一個失控的程式
- 2.什么是行程
- 3.行程的屬性
- PID:行程的ID號
- PPID:父行程的PID
- UID和 EUID:真實和有效的用戶ID
- 謙讓度和優先級
- 4.監視行程:ps命令
- 5.即時跟蹤行程資訊: top命令
- 6.查看占用檔案的行程:lsof
- 7.向行程發送信號:kill
一.Shell基本命令
- 一直以來Shell 以其穩定、高效和靈活成為系統管理員的首選,本文主要介紹Shell的基本命令,包括切換目錄、查找并查看檔案、查看用戶資訊等,本文過后,讀者還能夠向用戶手冊尋求幫助,在開始這些內容之前,首先簡要介紹一下究竟什么是 Shell,
1.Shell簡介

-
命令列和 Shell這兩個概念常常是令人困惑的,在很多并不正式的場合,這兩個名詞代表著相同的概念,即命令解釋器,然而從嚴格意義上講,命令列指的是供用戶輸入命令的界面,其本身只是接受輸入,然后把命令傳遞給命令解釋器,后者就是Shell,從本質上講,Shell 是一個程式,它在用戶和作業系統之間提供了一個面向行的可互動介面,用戶在命令列中輸入命令,運行在后臺的Shell 把命令轉換成指令代碼發送給作業系統,Shell 提供了很多高級特性,使得用戶和作業系統間的互動變得簡便和高效,
-
目前,在Linux環境下有幾種不同型別的Shell,常用的有Bourne Again Shell(BASH),TCSH Shcll、Z-Shell等,不同的Shell提供不盡相同的語法和特性,用戶可以使用任何一種Shell,在 Linux 上,BASH shell 是默認安裝和使用的Shell,本文章中所有的命令都在BASH下測驗通過,當然,讀者如果有興趣,也可以嘗試使用其他型別的Shell.
查看你正在使用的shell解釋器
echo $0

2.約定
- Linux命令列界面有一個輸入行,用于輸入命令,在 BASH中,命令列以一個美元符號“$”作為提示符,表示用戶可以輸入命令了,下面就是一個Shell提示符,表示命令列的開始,
$
如果正在以root身份執行命令,那么Shell提示符將成為“#”,如下所示,
#
本文中的命令將以 提示符+命令+注釋 的形式給出,以下面這個命令為例
$ sudo dpkg -i linuxqq_1.0-Preview1_i386.deb ##安裝QQ for Linux
- 其中,“$”符號為命令列提示符,“sudo dpkg -i linuxqq_1.0-Preview1_i386.deb”是命令,而“##”后面的文字則是注釋,注釋是為了更清楚地解釋命令用途而添加的,在實際使用程序中并不會出現,讀者在使用時只需要輸入命令部分,需要提醒的是,
Linux的命令和檔案名都是區分大小寫的,也就是說,SUDO和 sudo是不一樣的,
注意:在BASH的美元提示符前,一般還會有一段資訊,包括用戶名、主機名和當前目錄,一個完整的提示符如下:
[root@localhost ~]$
3.快速上手,瀏覽你的硬碟
本文將全程采用權限最高的root用戶,
-
本節將帶領讀者瀏覽自己計算機上的檔案系統,這里的命令都非常簡單,以期給讀者帶來一個整體的印象,稍后將詳細講解各類基本命令,
-
首先,打開終端進入根目錄看看里面都有些什么,

-
可以看到,Linux安裝完畢后自動在根目錄下生成了大量目錄和檔案,在后續章節中,將逐一討論這些目錄的用途,
-
下面選擇home進入,這個目錄中存放著系統中所有用戶的主目錄,主目錄的名字就是用戶名,在作者的計算機上,只有一個mzc用戶,

- 可以使用不帶任何引數的cd命令進入用戶主目錄,主目錄下存放著一些組態檔和用戶的私人檔案,用戶主目錄默認對其他用戶關閉訪問權限,

- 下面到/etc目錄下看一看,這個目錄存放著系統以及絕大部分應用軟體的組態檔(這里只列出了其中的一部分),和 Windows不同,Linux 使用純文本檔案來配置軟體,修改組態檔可以很方便地對軟體進行訂制,

- 查看一下 fstab這個檔案,其中定義了各硬碟磁區所掛載到的目錄路徑,

- 小伙伴們還可以選擇其他目錄進入并察看相應的檔案,看看Linux 都安裝了一些什么,接下來,在正式介紹命令之前,首先來看一些BASH的特性,這些特性可以幫助我們提高作業效率,
4.提高效率,使用命令列補全和通配符
- 檔案名是命令中最為常見的引數,然而每次完整輸入檔案名是一件很麻煩的事情,特別足當檔案名還特別長的時候,幸運的是,BASII 提供了這樣一種特性——命令列補全,在輸入檔案名的時候,只需要輸入前面幾個字符,然后按下Tab鍵,Shell 會自動把檔案名補全,
例如在/etc目錄下輸入cat fs +鍵盤tab鍵 Shell 會自動將其補全為cat fstab:
[root@localhost etc]# cat fstab
如果以已鍵入的字符開頭的檔案不止一個,那么可以連續按下Tab鍵兩次,Shell 會以串列的形式給出所有以鍵入字符開頭的檔案,例如在/etc/目錄下:
[root@localhost etc]# cat b
bash_completion.d/ bashrc binfmt.d/ bluetooth/ brltty/ brltty.conf
事實上,命令列補全也適用于所有Linux命令,例如輸入ca并按下 Tab鍵兩次時,如下:
[root@localhost etc]# ca
cacertdir_rehash cache_metadata_size cairo-sphinx calibrate_ppa canberra-gtk-play capsh case catman
cache_check cache_repair cal caller cancel captoinfo cat
cache_dump cache_restore ca-legacy canberra-boot cancel.cups caribou-preferences catchsegv
-
注意:系統命令本質上就是一些可執行檔案,可以在/usr/bin/目錄下找到,從這種意義上講,命令補全和檔案名補全其實是一回事, -
另外,Shell有一套被稱作通配符的專用符號,它們是
*、?和[ ],這些通配符可以搜索并匹配檔案名的一部分,從而大大簡化命令的輸入,這使得批量操作成為可能,
*用于匹配檔案名中任意長度的字串,例如需要列出當前目錄中所有的.login結尾的檔案,命令如下:
[root@localhost etc]# ls
abrt cgsnapshot_blacklist.conf enscript.cfg gshadow- libaudit.conf nfsmount.conf pulse security tcsd.conf
adjtime chkconfig.d environment gss libibverbs.d nsswitch.conf purple selinux terminfo
aliases chrony.conf ethertypes gssproxy libnl nsswitch.conf.bak python services tmpfiles.d
aliases.db chrony.keys exports host.conf libreport ntp qemu-ga sestatus.conf trusted-key.key
alsa cifs-utils exports.d hostname libuser.conf ntp.conf qemu-kvm setroubleshoot tuned
alternatives cron.d favicon.png hosts libvirt numad.conf radvd.conf setuptool.d udev
anacrontab cron.daily fcoe hosts.allow locale.conf oddjob rc0.d sgml udisks2
asound.conf cron.deny festival hosts.deny localtime oddjobd.conf rc1.d shadow unbound
at.deny cron.hourly filesystems hp login.defs oddjobd.conf.d rc2.d shadow- updatedb.conf
at-spi2 cron.monthly firefox idmapd.conf logrotate.conf openldap rc3.d shells UPower
audisp crontab firewalld init.d logrotate.d opt rc4.d skel usb_modeswitch.conf
audit cron.weekly fonts inittab lsm os-release rc5.d smartmontools vconsole.conf
autofs.conf crypttab fprintd.conf inputrc lvm PackageKit rc6.d sos.conf vimrc
autofs_ldap_auth.conf csh.cshrc fstab ipa machine-id pam.d rc.d speech-dispatcher virc
auto.master csh.login fuse.conf iproute2 magic passwd rc.local ssh vmware-tools
auto.master.d cups gconf ipsec.conf mail.rc passwd- rdma ssl wgetrc
auto.misc cupshelpers gcrypt ipsec.d makedumpfile.conf.sample pbm2ppa.conf redhat-release sssd wpa_supplicant
auto.net dbus-1 gdbinit ipsec.secrets man_db.conf pinforc request-key.conf statetab wvdial.conf
auto.smb dconf gdbinit.d iscsi maven pkcs11 request-key.d statetab.d X11
avahi default gdm issue mke2fs.conf pki resolv.conf subgid xdg
bash_completion.d depmod.d geoclue issue.net modprobe.d plymouth rpc subuid xinetd.d
bashrc dhcp GeoIP.conf java modules-load.d pm rpm sudo.conf xml
binfmt.d DIR_COLORS GeoIP.conf.default jvm motd pnm2ppa.conf rsyncd.conf sudoers yum
bluetooth DIR_COLORS.256color ghostscript jvm-commmon mtab polkit-1 rsyslog.conf sudoers.d yum.conf
brltty DIR_COLORS.lightbgcolor gnupg kdump.conf mtools.conf popt.d rsyslog.d sudo-ldap.conf yum.repos.d
brltty.conf dleyna-server-service.conf GREP_COLORS kernel multipath postfix rwtab sysconfig
centos-release dnsmasq.conf groff krb5.conf my.cnf ppp rwtab.d sysctl.conf
centos-release-upstream dnsmasq.d group krb5.conf.d my.cnf.d prelink.conf.d samba sysctl.d
certmonger dracut.conf group- ksmtuned.conf nanorc printcap sane.d systemd
cgconfig.conf dracut.conf.d grub2.cfg ld.so.cache netconfig profile sasl2 system-release
cgconfig.d drirc grub.d ld.so.conf NetworkManager profile.d scl system-release-cpe
cgrules.conf e2fsck.conf gshadow ld.so.conf.d networks protocols securetty target
[root@localhost etc]# ls *.login
csh.login
[root@localhost etc]#
和*相類似的通配符是?,但和*匹配任意長度的字串不同,?只匹配一個字符,下面的例子中,?用以匹配檔案名中以text開頭而后跟一個字符的檔案,
[root@localhost opt]# ls
rh testA test_A testB testBS testD
[root@localhost opt]# ls test?
testA:
testB:
testD:
[root@localhost opt]#
5.查看目錄和檔案
- 本節將介紹目錄和檔案的操作命令,這些可能是用戶最常用到的命令了,其中的一些在“快速上手”環節已經嘗試過了,這里將作進一步講解,詳細討論命令各個常用選項,小伙伴們應該始終牢記的一點是,應該用肌肉,而不是頭腦去記憶這些命令和選項,
顯示當前目錄:pwd
- pwd命令會顯示當前所在的位置,即作業目錄,例如,執行如下命令:

小貼士:讀者可能會問一個問題,既然在BASH的命令提示符前,會顯示當前作業路徑名,那么為什么還需要pwd這個命令呢?答案是這個特性并不是所有Shell都采用的.在Freebsd等作業系統中,BASH并不自動顯示當前目錄,因此即便在某個版本的Linux 中,pwd 顯得完全沒有必要,這并不意味著在其他版本的UNIX/Linux系統中,pwd也是無用的,
改變目錄:cd
-
cd命令是在Linux檔案系統的不同部分之間移動的基本工具,當登錄系統之后,總是處在用戶主目錄中,這個目錄有一個名字,也就是“路徑名”,它是由/home/開頭,后面跟著登錄的用戶名,
-
輸入cd命令,后面跟著一個路徑名作為引數,就可以直接進入另外一個子目錄中去,舉例來說,使用下面的命令進入/usr/bin子目錄,

- 在/usr/bin子目錄時,可以用以下命令進入/usr子目錄

- 在/usr/bin子目錄中還可以使用下面的命令直接進入根目錄,即“/”目錄,

- 最后,總能夠用下面的命令回到自己的用戶主目錄,

- 或者

提示:在Shell 中,“..”代表當前目錄的上一級目錄,而“.”則代表當前目錄.另外,“~”代表用戶主目錄,這個符號通常位于Esc鍵下方,
列出目錄內容:ls
ls命令是list的簡化形式,ls 的命令選項非常之多,這里只討論一些最常用的選項,
- 不帶任何引數的ls命令,用于列出當前目錄下的所有檔案和子目錄,例如:

- 白色:表示普通檔案
- 藍色:表示目錄
- 綠色:表示可執行檔案
- 紅色:表示壓縮檔案
- 淺藍色:鏈接檔案 主要是使用ln命令建立的檔案
- 紅色閃爍:表示鏈接的檔案有問題
- 黃色:表示設備檔案
- 灰色:表示其他檔案
- 但是這些檔案就是主目錄下所有的檔案了嗎?嘗試一下-a選項,如下:

-
這次看到了很多頭部帶“.”的檔案名,在 Linux上,這些檔案被稱作隱含檔案,在默認情況下并不會顯示,除非指定了-a選項,用于顯示所有檔案,
-
另一個常用選項是-1選項,這個選項可以用來查看檔案的各種屬性,例如:

- total:代表總用量
-表示是普通檔案,第一個字符有幾種情況:-表示普通檔案,d代表目錄,l代表連接檔案,b代表設備檔案,- -rwxrw-rw- 表示檔案的權限,linux中有三種檔案操作權限:分別為讀(
r),寫(w),執行(x).- 第一個root表示這個檔案的所屬用戶是root
- 第二個root表示這個檔案的所屬用戶組是lan這個組
- 接下類的數字 101 表示檔案的大小,也就是位元組數, 101表示101位元組
- 接下來的是,檔案最近一次修改的時間
- 最后就是檔案名了
- 在ls命令后跟上路徑名可以查看該子目錄中的內容,例如:

列出目錄內容:dir和vdir
- Windows用戶可能更熟悉dir這個命令,在Linux 中,dir除了比ls的功能更少,其他都是一樣的,

- vdir 相當于為ls命令加上-1選項,默認情況下列出目錄和檔案的完整資訊,

查看文本檔案:cat和more
- cat命令用于查看檔案內容(通常這是一個文本檔案),后跟檔案名作為引數,例如:

- cat可以跟多個檔案名作為引數,當然也可以使用通配符:

- 對于程式員而言,為了除錯方便,常常需要顯示行號,為此,cat命令提供了-n選項,在每一行前顯示行號,

- cat命令會一次將所有內容全部顯示在螢屏上,這看起來是一個致命的缺陷,因為對于一個長達幾頁甚至幾十頁的檔案而言,cat顯得毫無用處,為此,Linux 提供more命令來一頁一頁地顯示檔案內容,如下:

- 可以看到,more命令會在最后顯示一個百分比,表示已顯示內容占整個檔案的比例,按下空格鍵向下翻動一頁,按Enter鍵向下滾動一行,按Q鍵退出,
閱讀檔案的開頭和結尾:head和tail
- 另兩個常用的查看檔案的命令是head和 tail,分別用于顯示檔案的開頭和結尾,可以使用-n引數來指定顯示的行數,

注意,head命令的默認輸出是包括了檔案名的(放在-->和<--之間),tail的用法和head相同,

更好的文本閱讀工具:less
- less 和 more非常相似,但其功能更為強大,less 改進了more命令的很多細節,并添加了許多的特性,這些特性讓 less 看起來更像是一個文本編輯器——只是去掉了文本編輯功能,總體來說,less命令提供了下面這些增強功能,
| 命令符號 | 描述 |
|---|---|
| /字串 | 向下搜索“字串”的功能 |
| ?字串 | 向上搜索“字串”的功能 |
| n | 重復前一個搜索(與 / 或 ? 有關) |
| N | 反向重復前一個搜索(與 / 或 ? 有關) |
| b | 向前翻一頁 |
| d | 向后翻半頁 |
| q | 退出 less 命令 |
| 空格鍵 | 向后翻一頁 |
| 向上鍵 | 向上翻動一行 |
| 向下鍵 | 向下翻動一行 |
- 下面簡單地介紹less 命令的使用方法,以/etc/cgconfig.conf檔案為例,輸入下面這條命令,

-
可以看到,less在螢屏底部顯示一個冒號
:等待用戶輸入命令符號,具體符號可以參考上方表格, -
使用帶引數-M的less命令可以顯示更多的檔案資訊,如下:

- 可以看到,lcss 在輸出的底部顯示了這個檔案的名字、當前頁碼、總的頁碼,以及表示當前位置在整個檔案中的位置百分比數值,最后按下Q鍵可以退出less程式并回傳Shell提示符,
查找檔案內容:grep
- 在很多時候,并不需要列出檔案的全部內容,用戶要做的只是找到包含某些資訊的一行,這個時候,如果使用more命令一行一行去找的話,無疑是費時費力的,當檔案特別大的時候,這樣的做法則完全不可行了,為了在檔案中尋找某些資訊,可以使用grep命令,
grep [OPTIONS] PATTERN [FILE...]
- 例如,為了在檔案drirc中查找包含 device的行,可以使用如下命令:

- 可以看到,grep 有兩個型別不同的引數,第一個是被搜索的模式(關鍵詞),第二個是所搜索的檔案,grep 會將檔案中出現關鍵詞的行輸出,可以指定多個檔案來搜索,例如:

- 嚴格地說,grep通過“基礎正則運算式( basic regular expression)”進行搜索,和grep相關的一個工具是cgrep,除了使用“擴展的正則運算式( extended regular expression)”,egrep 和grep 完全一樣,“擴展正則運算式”能夠提供比“基礎正則運算式”更完整地表達規范,正則運算式將在后續文章中詳細討論,
指定目錄下查找檔案:find
- 隨著檔案增多,使用搜索工具成了順理成章的事情,find 就是這樣一個強大的命令,它能夠迅速在指定范圍內查找到檔案,find命令的基本語法如下:
find [OPTION] [path...] [expression]
- 例如,希望在/usr/bin/目錄中查找zip命令:

- 從這個例子中可以看到,find 命令需要一個路徑名作為查找范圍,在這里是/usr/bin/ ,find 會深入到這個路徑的每一個子目錄中去尋找,因此如果指定
/,那么就查找整個檔案系統,-name選項指定了檔案名,在這里是zip,可以使用通配符來指定檔案名,如find~/ -name *.c-print將列出用戶主目錄下所有的c程式檔案,-print 表示將結果輸出到標準輸出(在這里也就是螢屏),注意find命令會列印出檔案的絕對路徑, - find命令還能夠指定檔案的型別,在 Linux 中,包括目錄和設備都以檔案的形式表現,可以使用-type選項來定位特殊檔案型別,例如,在/etc/目錄中查找名叫init.d的目錄:

find命令的-type選項可供使用的引數
| 引數 | 含義 |
|---|---|
| b | 塊設備檔案 |
| c | 字符設備檔案 |
| d | 目錄檔案 |
| f | 普通檔案 |
| p | 命名管道 |
| l | 符號鏈接 |
- 還可以通過指定時間來指導find命令查找檔案,-atime n用來查找最后一次使用在n天前的檔案,-mtime n則用來查找最后一次修改在n天前的檔案,但是在實際使用程序中,很少能準確確定n的大小,在這種情況下,可以用+n表示大于n,用-n表示小于n,例如,在/usr/bin/中查找最近100天內沒有使用過的命令(也就是最后一次使用在100天或100天以前的命令),

- 類似地,下面這個命令查找當前目錄中,在最近一天內修改過的檔案,

快速定位檔案:locate
- 盡管find命令已經展現了其強大的搜索能力,但對于大批量的搜索而言,還是顯得慢了一些,特別是當用戶完全不記得自己的檔案放在哪里的時候,這時,locate命令會是一個不錯的選擇,如下:

- 這些搜索結果幾乎是一瞬間就出現了,這不禁讓人疑惑,locate 究竟是如何做到這一點的?事實上,locate并沒有進入子目錄搜索,它有一點類似于Google的桌面搜索,通過檢索檔案名資料庫來確定檔案的位置,locate命令自動建立整個檔案名資料庫,不需要用戶插手,如果希望立刻生成該資料庫檔案的最新版本,那么可以使用updatedb命令,運行這個命令需要有root權限,更新整個資料庫大概耗時1分鐘,
查找特定程式:whereis
- whereis命令主要用于查找程式檔案,并提供這個檔案的二進制可執行檔案、源代碼檔案和使用手冊頁存放的位置,例如,查找find命令:
- 可以使用-b選項讓 whereis命令只查找這個程式的二進制可執行檔案,

- 如果whereis無法找到檔案,那么將回傳一個空字串,

- whereis無法找到某個檔案的可能原因是,這個檔案沒有存在于任何whereis命令搜索的子目錄中,whereis命令檢索的子目錄是固定撰寫在它的程式中的,這看起來多少有點像是個缺陷,但把搜索限制在固定的子目錄如/usr/bin、/usr/sbin和/usr/share/man中可以顯著加快檔案查找的進度,
用戶及版本資訊查看:who
- 在一臺服務器上,同一時間往往會有很多人同時登錄,who命令可以查看當前系統中有哪些人登錄,以及他們都作業在哪個控制臺上,

- 有些時候,可能會忘記自己是以什么身份登錄到系統,特別當需要以特定身份啟動某個服務器程式時,這個時候, whoami這個命令會很有用,正如這個命令的名字那樣, whoami會回答“我是誰”這個問題,

- 另一個常用的命令是uname,用于顯示當前系統的版本資訊,帶-a選項的uname命令會給出當前作業系統的所有有用資訊,

- 在大部分時候,需要的只是其中的內核版本資訊,此時可以使用-r選項,

尋求幫助:man
- 在Linux中獲取幫助是一件非常容易的事情,Linux為幾乎每一個命令和系統呼叫撰寫了幫助手冊,使用man命令可以方便地獲取某個命令的幫助資訊,
- man命令在顯示手冊頁時實際呼叫的是less程式,可以通過方向鍵或J鍵(表示向下)、K(表示向上)鍵上下翻動,空格鍵用于向下翻動一頁,按下Q鍵則退出手冊頁面,man手冊一般被分成9節,各部分內容如表5.2所示,
man手冊的組織
| 目錄 | 內容 |
|---|---|
| /usr/share/man/man1 | 普通命令和應用程式 |
| /usr/share/man/man2 | 系統呼叫 |
| /usr/share/man/man3 | 庫呼叫,主要是libc()函式的使用檔案 |
| /usr/share/man/man4 | 設備驅動和網路協議 |
| /usr/share/man/man5 | 檔案的詳細格式資訊 |
| /usr/share/man/man6 | 游戲 |
| /usr/share/man/man7 | 檔案使用說明 |
| /usr/share/man/man8 | 系統管理命令 |
| /usr/share/man/man9 | 內核源代碼或模塊的技術指標 |
獲取命令簡介:whatis和apropos
- man手冊中的長篇大論有時候顯得太啰嗦了——很多情況下,人們只是想要知道一個命令大概可以做些什么,于是,whatis滿足了大家的好奇心,
- whatis從某個程式的使用手冊頁中抽出一行簡單的介紹性文字,幫助用戶了解這個程式的大致用途,whatis的原理同locate命令基本一致,
- 與之相反的一個命令是 apropos,這個命令可以通過使用手冊中反查到某個命令,舉例來說,如果用戶想要搜索一個檔案,而又想不起來應該使用哪個命令的時候,可以這樣求助于apropos,

- 可以看到,apropos將命令簡介(其實就是whatis的輸出)中包含“search”的條目一并列出,用戶總能夠從中找到自己想要的,
二.檔案目錄管理
- 使用檔案和目錄是作業中不可回避的環節,通過前面的章節,讀者已經積累了一些檔案和目錄的操作經驗,本章將進一步介紹如何使用Shell管理檔案和目錄,在正式講解相關命令之前,有必要介紹一下Linux目錄結構的組織形式,小伙伴們應該已經在之前的文章大概了解了整個檔案系統,但仍對此心存疑惑,
1.Linux 檔案系統的架構
-
正如大家看到的一樣,Linux目錄結構的組織形式和 Windows有很大的不同,首先Linux沒有
盤符的概念,也就是說Linux 系統不存在所謂的C盤、D盤等,已建立檔案系統的硬碟磁區被掛載到某一個目錄下,用戶通過操作目錄來實作磁盤讀寫,正如讀者在安裝Linux時所注意到的那樣,其次,Linux似乎不存在像Windowsl這樣的系統目錄,在安裝完成后,就有一堆目錄出現在根目錄下,并且看起來每一個目錄中都存放著系統檔案,最后一個小小的區別是,Linux使用正斜杠/而不是反斜杠\來標識目錄, -
既然Linux將檔案系統掛載到目錄下,那么究竟是先有檔案系統還是先有目錄?和“先有雞還是先有蛋”一樣,這個問題初看起來有點讓人犯暈,正確的說法是,Linux需要首先建立一個根
/檔案系統,并在這個檔案系統中建立一系列空目錄,然后將其他硬碟磁區(如果有的話)中的檔案系統掛載到這些目錄中, -
理論上說,可以為根目錄下的每一個目錄都單獨劃分一個硬碟磁區,這樣根磁區的容量就可以設定得很小(因為幾乎所有的東西都存放在其他磁區中,根磁區中的目錄只是起到了
映射的作用),不過這對于普通用戶而言沒有太大必要, -
如果某些目錄沒有特定的硬碟磁區與其掛鉤的話,該目錄中的所有內容將存放在根磁區中,
提示:說了那么多,有一個概念始終沒有作解釋,究竟什么是檔案系統?這個問題將在后續的文章中詳細討論,這里,讀者只要簡單地把它理解為
磁盤或者磁區的同義詞就可以了,
Linux系統主要目錄以及其內容
| 目錄 | 內容 |
|---|---|
| /bin | 構建最小系統所需要的命令(最常用的命令) |
| /boot | 內核與啟動檔案 |
| /dev | 各種設備檔案 |
| /etc | 系統軟體的啟動和組態檔 |
| /home | 用戶的主目錄 |
| /lib | C編譯器的庫 |
| /media | 可移動介質的安裝點 |
| /opt | 可選的應用軟體包(很少使用) |
| /proc | 行程的映像 |
| /root | 超級用戶root的主目錄 |
| /sbin | 和系統操作有關的命令 |
| /tmp | 臨時檔案存放點 |
| /usr | 非系統的程式和命令 |
| /var | 系統專用的資料和組態檔 |
2.共享檔案
- 共享檔案對一個團隊而言非常重要,團隊的成員常常需要在一臺服務器上共同完成一項任務(如開發一套應用軟體),下面介紹如何實作用戶間檔案的共享,假設這個團隊的成員在服務器上的用戶名分別是zll、fjn,它們都屬于workgroup這個用戶組,可以用以下的命令模擬這個場景,

- 首先在/home目錄下建立一個名為work 的目錄,作為這個小組的作業目錄,注意需要root權限,


- 現在,任何人都可以訪問這個新建的目錄,而只有root用戶才擁有該目錄的寫權限,現在希望讓 workgroup組的成員擁有這個目錄的讀寫權限,并禁止其他無關的用戶查看這個目錄,

- 接下來需要將這個目錄交給一個組長zll(現在 work目錄的所有者還是root 用戶),

- 現在,所有屬于這個組的成員都可以訪問并修改這個目錄中的內容了,而其他未經授權的用戶(除了root)則無法看到其中的內容,舉例來說,zll在/home/work目錄下新建了一個名為test的空檔案,那么同屬一個組的用戶fjn 如果認為這個檔案沒有必要,可以有權限洗掉它,
3.建立檔案和目錄
- 本節將介紹如何在Linux中建立檔案和目錄,這是檔案和目錄管理的第一步,
建立目錄:mkdir
- mkdir命令可以一次建立一個或幾個目錄,下面的命令在用戶主目錄下建立document、picture兩個目錄,

- 用戶也可以使用絕對路徑來新建目錄,


- 相信大家創建的時候會報這個錯誤,這是因為當前在用戶主目錄下并沒有test這個目錄,自然也無法在 test下創建job目錄了,為此mkdir提供了-p選項,用于完整地創建一個子目錄結構,

- 在這個例子中,mkdir會首先創建test目錄,然后創建job,在需要創建一個完整目錄結構的時候,這個選項是非常有用的,
建立一個空檔案:touch
- touch命令的使用非常簡單,只需要在后面跟上一個檔案名作為引數,下面這個命令在當前目錄下新建一個名為hello的檔案,

-
用touch命令建立的檔案是空檔案(也就是不包含任何內容的檔案),空檔案對建立某些特定的實驗環境是有用,另外,當某些應用程式因為缺少檔案而無法啟動,而這個檔案實際上并不那么重要時,可以建立一個空檔案暫時“騙過”這個程式,
-
用touch命令建立的檔案是空檔案(也就是不包含任何內容的檔案),空檔案對建立某些特定的實驗環境是有用,另外,當某些應用程式因為缺少檔案而無法啟動,而這個檔案實際上并不那么重要時,可以建立一個空檔案暫時“騙過”這個程式,
-
touch命令的另一個用途是更新一個檔案的建立日期和時間,例如,對于hello這個檔案,使用ls-1命令顯示這個檔案的建立時間為11點43分,

- 使用touch命令更新后,建立時間變成了當前時間,

- touch命令的這個功能在自動備份和整理檔案時非常有用,這使得程式可以決定哪些檔案已經被備份或整理過了,關于檔案備份,可持續關注后續文章,
4.移動 復制和洗掉
- 通過上述的學習小伙伴們已經能夠創建檔案和目錄,本節將繼續討論如何移動、復制和洗掉檔案及目錄,這是在檔案和目錄管理中另一個基本操作,下面首先從移動檔案開始討論,
移動和重命名:mv
- mv取了move 的縮寫形式,這個命令可以用來移動檔案,下面這條命令將hello檔案移動到bin目錄下,

- 當然也可以移動目錄,下面這條命令把 Photos目錄移動到/home目錄下,

- Linux沒有“重命名”這個命令,原因很簡單,即沒有這個必要,重命名無非就是將一個檔案在同一個目錄里移動,這是mv最擅長的作業,

- 因此對mv 比較準確的描述是,mv可以在移動檔案和目錄的同時對其重命名,
復制檔案和目錄:cp
- cp命令用來復制檔案和目錄,下面這條命令將檔案test復制到/home目錄下,

- cp命令在執行復制任務的時候會自動跳過目錄,為此,可以使用-r選項,這個選項將子目錄連同其中的檔案一起復制到另一個子目錄下,

洗掉目錄和檔案:rmdir和rm
- rmdir命令用于洗掉目錄,這個命令的使用非常簡單,只需要在后面跟上要洗掉的目錄名作為引數即可,

- 但是rmdir命令只能洗掉空目錄,洗掉有內容的目錄會提示錯誤,

-
因此,在使用rmdir 洗掉一個目錄之前,首先要將這個目錄下的檔案和子目錄洗掉,洗掉檔案需要用到rm命令,稍后將會看到,rm同樣可以用來洗掉目錄,而且比 rmdir更為“高效”,由于這個原因,在實際使用中rmdir很少被用到,
-
rm命令可以一次洗掉一個或幾個檔案,下面這條命令可以搭配通配符使用洗掉Ptest目錄下所有的所有檔案,值得注意的是洗掉較多的檔案避免一一確認可以使用下面選項,進行操作,
| 符號 | 作用 |
|---|---|
| -i | 洗掉前逐一詢問確認, |
| -f | 即使原檔案屬性設為唯讀,亦直接洗掉,無需逐一確認, |
| -r | 將目錄及以下之檔案亦逐一洗掉, |

注意:使用rm命令的時候應該格外小心,特別是以 root身份執行該命令時,
5.檔案和目錄的權限
- 很難想像沒有權限的世界會變成什么樣子,隨便哪個用戶都可以大搖大擺地“溜”進別人的目錄,然后對里面的檔案亂改一氣,當然,他自己的檔案也可能正經歷著同樣的命運,Linux是一個多用戶的作業系統,正確地設定檔案權限非常重要,
權限設定針對的用戶
-
Linux 為3種人準備了權限——檔案所有者(屬主)、檔案屬組用戶和其他人,因為有了“其他人”,這樣的分類將世界上所有的人都包含進來了,但讀者應該已經敏感地意識到,root用戶其實是不應該被算在“其他人”里面的,root 用戶可以查看、修改、洗掉所有人的檔案——不要忘了root擁有控制一臺計算機的完整權限,
-
檔案所有者通常是檔案的創建者,但這也不是一定的,可以中途改變一個檔案的屬主用戶,這必須直接由root用戶來實施,這句話換一種說法或許更貼切:檔案的創建者自動成為檔案所有者(屬主),檔案的所有權可以轉讓,轉讓“手續”必須由root 用戶辦理,
-
可以(也必須)把檔案交給一個組,這個組就是檔案的屬組,組是一群用戶組成的一個集合,類似于學校里的一個班、公司里的一個部門……檔案屬組中的用戶按照設定對該檔案享有特定的權限,通常來說,當某個用戶(如zll)建立一個檔案時,這個檔案的屬主就是zll,檔案的屬組是只包含一個用戶zll的zll 組,當然,也可以設定檔案的屬組是一個不包括檔案所有者的組,在檔案所有者執行檔案操作時,系統只關心屬主權限,而組權限對屬主是沒有影響的,
提示:關于用戶和用戶組的概念,在后面文章會進行詳細講解
- 最后,“其他人”就是不包括前兩類人和root 用戶在內的“其他”用戶,通常來說,“其他人”總是享有最低的權限(或者干脆沒有權限),
需要設定那些權限
-
可以賦予某類用戶對檔案和目錄享有3種權限:
讀取(r)、寫入(w和執行(x),對于檔案而言,擁有讀取權限意味著可以打開并查看檔案的內容,寫入位控制著對檔案的修改權限,而是否能夠洗掉和重命名一個檔案則是由其父目錄的權限設定所控制的, -
要讓一個檔案可執行,必須設定其執行權限,可執行檔案有兩類,一類是可以直接由CPU執行的二進制代碼;另一類是Shell腳本程式,
-
對目錄而言,所謂的執行權限實際控制了用戶能否進入該目錄;而讀取權限則負責確定能否列出該目錄中的內容;寫入權限控制著在目錄中創建、洗掉和重命名檔案,因此目錄的執行權限是其最基本的權限,
查看檔案和目錄的屬性
- 使用帶選項-1的ls命令可以查看一個檔案的屬性,包括權限,首先來看一個例子:

- 這條命令列出了/bin/login檔案的主要屬性資訊,下面逐段分析這一行字串所代表的含義,
- 第1個欄位的第1個字符表示檔案型別,在上例中是
-,表示這是一個普通檔案,- 接下來的
rwxr-xr-X就是3組權限位,這9個字符應該被這樣斷句:rwX、r-X、T-X,分別表示屬主、屬組和其他人所擁有的權限,r表示可讀取,w表示可寫,x表示可執行,如果某個權限被禁用,那么就用一個短劃線-代替,在這個例子中,屬主擁有讀、寫和執行權限,屬組和其他人擁有讀和執行權限,- 第3個和第4個欄位分別表示檔案的屬主和屬組,在這個例子中,login 檔案的屬主是root 用戶,而屬組是root組,
- 緊跟著3組權限位的數字表示該檔案的鏈接數目,這里是1,表示該檔案只有一個
- 最后的4個欄位分別表示檔案大小(37208位元組)、最后修改的日期,以及這個檔案的完整路徑(/bin/login),
- 最后,不帶檔案名作為引數的ls-1命令列出當前目錄下所有檔案(不包括隱藏檔案)的屬性,

改變檔案所有權:chown和chgrp
- chown命令用于改變檔案的所有權,chown命令的基本語法如下:
sudo [OPTION]... [OWNER][:[GROUP]] FILE...
- 這條命令將檔案FILE的屬主更改為OWNER,屬組更改為GROUP,下面這條命令將檔案 test的屬主更改為zll,而把其屬組更改為root組,

- 如果只需要更改檔案的屬主,那么可以省略引數 GROUP ,下面這條命令把 test檔案的屬主更改為fjn用戶,而保留其屬組設定,

- 相應地,可以省略引數OWNER,而只改變檔案的屬組,注意,不能省略組名GROUP前的那個冒號
:,下面這條命令把 test 檔案的屬組更改為 fjn 組,而保留其屬主設定,

- Linux單獨提供了另一個命令chgrp用于設定檔案的屬組,下面這條命令將檔案 test的屬組設定為workgroup組,

- chgrp命令實際上只是實作了chown 的一部分功能,但這個命令至少在名字上更直觀地告訴人們它要干什么,在實際作業中,是否使用chgrp僅僅是個人習慣的問題,
改變檔案權限:chmod
- chmod用于改變一個檔案的權限,這個命令使用“用戶組+/-權限”的表述方式來增加/洗掉相應的權限,具體來說,用戶組包括了檔案屬主(u)、檔案屬組(g)、其他人(o)和所有人(a),而權限則包括了讀取(r)、寫入(w)和執行(x),例如,下面這條命令增加了屬主對檔案test的執行權限,
chmod u+x test
- chmod可以用a同時指定所有的3種人,下面這條命令洗掉所有人(屬主、屬組和其他人)對test的執行權限,
chmod a-x test
- 還可以通過“用戶組=權限”的規則直接設定檔案權限,同樣應用于檔案 test,下面這條命令賦予屬主和屬組的讀取/寫入權限,而僅賦予其他用戶讀取權限,
chmod ug=rw,o=r test
- 最后一條常用規則是“用戶組1=用戶組2”,用于將用戶組1的權限和用戶組2的權限設為完全相同,應用于檔案test中,下面這條命令將其他人的權限設定為和屬主的權限一樣,
chmod o=u test
注意:只有檔案的屬主和root用戶才有權修改檔案的權限,
檔案權限的八進制表示
-
chmod的助記符盡管意義明確,但有些時候顯得太啰嗦了,系統管理員更喜歡用chmod的八進制語法來修改檔案權限——這樣就可以不用麻煩左右手的小指了,為此,管理員至少應該熟練掌握8以內的加法運算——能口算是最好的,
-
首先簡單介紹一下八進制記法的來歷,每一組權限rwx在計算機中實際上占用了3位,每一位都有兩種情況,例如對于寫入位,只有“設定(r)”和沒有設定(-)兩種情況,這樣計算機就可以使用二進制0和1來表示每一個權限位,其中0表示沒有設定,而1表示設定,例如rwx就被表示為111,“-w-”表示為010等,
-
由于3位二進制數對應于1位八進制數,因此可以進一步用一個八進制數字來表示一組權限,下方圖片顯示了八進制、二進制、檔案權限之間的對應關系,

- 不必記住上面所有這些數字的排列組合,在實際使用中,只要記住1代表x,2代表w,4代表r,然后簡單地做加法就可以了,舉例來說,rwx =4+2+1=7,r-x =4+0+1=5,這樣一來,完整的9位權限位就可以用3個八進制數表示了,例如“rwxr-X–x”就對應于“751”,下面這條命令將檔案 test 的所有權限賦予屬主,而屬組用戶和其他人僅有執行權限:

6.檔案型別
- 小伙伴們很快會意識到,Linux中的一切都被表示成檔案的形式,這包括程式行程、硬體設備、通信通道甚至是內核資料結構等,這種設定給很多人帶來了理解上的困難——除了Linux程式員,因為這給他們帶來了一致的編程介面,Linux中一共有7種檔案型別,下面簡要介紹閱讀檔案型別的方法,并著重介紹一下符號鏈接,
查看檔案型別
-
使用帶 -l 選項的 ls命令可以查看檔案型別,

-
命令顯示的第1個字符就是檔案型別,在上面這個例子中,days檔案夾中的所有檔案都是普通檔案所有使用
-來表示,
Linux中的檔案型別

-
正如大家已經知道的那樣,Linux用設備檔案來標識一個特定的硬體設備,Linux中有兩類設備檔案:字符設備檔案和塊設備檔案,字符設備指的是能夠從它那里讀取成字符序列的設備,如磁帶和串行線路;塊設備指的是用來存盤資料并對其各部分內容提供同等訪問權的設備,如磁盤,和字符設備有時又被稱為順序訪問設備一樣,塊設備有時也被稱為隨機訪問設備,顧名思義,使用塊設備,可以從硬碟的任何隨機位置獲取資料;而使用字符設備則必須按照資料發送的順序從串行線路上獲取,
-
擁有某個設備檔案并不意味著一定有一個相對應的硬體設備存在,這只是表明 Linux有處理這種設備的“潛能”,設備檔案可以用mknod命令來創建,對這個命令的討論已經超出了這篇文章的范圍,
-
本地域套介面和有名管道都是有關行程間通信的,Linux 程式員需要了解這些內容,普通用戶可能永遠也不會接觸這兩個東西,
-
符號鏈接有點像Windows里的快捷方式,用戶可以通過別名去訪問另一個檔案,
建立鏈接:ln
符號鏈接(也被稱作“軟連接”)需要使用帶-s引數的ln命令來創建,下面是這個命令最簡單的形式,這條命令給目標檔案test 取了一個別名my_test,如下:

- 下面的例子具體說明了符號鏈接的作用,

-
從my_test的屬性中可以看到,這個檔案被指向test,從此訪問my_test就相當于訪問test,例如:
-
修改my_test的內容

- 查看test內容

-
my_test只是檔案 test的一個“別名”,因此洗掉my_test并不會影響到test,但如果把 test洗掉了,那么my_test雖然還保留在那里,但已經沒有任何意義了,
-
符號鏈接還可用于目錄,下面這條命令建立了一個指向/usr/local/share 的符號鏈接local_share,

- 查看local_share的屬性的確可以看到這一點,

- Linux 在中還有一種鏈接被稱為“硬鏈接”,這種鏈接用于將兩個獨立的檔案聯系在一起,硬鏈接和符號鏈接本質的不同在于:硬鏈接是直接參考,而符號鏈接是通過名稱進行參考,使用不帶選項的ln命令建立硬鏈接,

- 上面這條命令建立了一個鏈接到days 的新檔案hard_days,查看兩者的屬性可以看到,這是兩個完全獨立的檔案,只是被聯系在一起了而已,

- 這兩個檔案擁有相同的內容,對其中一個檔案的改動會反映在另一個檔案中,用熟悉的文本編輯器打開test,添加一個a,可以看到 my_test中的內容也改變了,


在實際作業中,人們更多地選擇使用符號連接(軟連接),硬鏈接已經很少使用,
7.輸入輸出重定向和管道
- 重定向和管道是 Shell 的一種高級特性,這種特性允許用戶人為地改變程式獲取輸入和產生輸出的位置,這個有趣的功能并不是 Linux的專利,幾乎所有的作業系統(包括Windows)都能支持這樣的操作,
輸出重定向
- 程式在默認情況下輸出結果的地方被稱為標準輸出(stdout),通常來說,標準輸出總是指向顯示幕,例如,下面的ls命令獲取當前目錄下的檔案串列,并將其輸出到標準輸出,于是用戶在螢屏上看到了這些檔案名,

- 輸出重定向用于把程式的輸出轉移到另一個地方去,下面這條命令將ls 的輸出重定向到ls_out檔案中,

- 這樣,ls的輸出就不會在顯示幕上顯示出來,而是出現在用戶主目錄的ls_out檔案中,每一行顯示一個檔案名,

注意:如果ls_out檔案不存在,那么輸出重定向符號“>”會試圖建立這個檔案,如果 ls_out 檔案已經存在了,那么“>”會洗掉檔案中原有的內容,然后用新內容替代,

- 可以看到,“>”并不會禮貌地在原來那堆檔案名的后面添上版本資訊,而是直接覆寫了,如果要保留原來檔案中的內容,應該使用輸出重定向符號“>>”,

輸入重定向
- 和標準輸出類似,程式默認情況下接收輸入的地方被稱為標準輸入( stdin),通常來說,標準輸入總是指向鍵盤,例如,如果使用不帶任何引數的cat命令,那么 cat會停在那里,等待從標準輸入(也就是鍵盤)獲取資料,
cat
- 用戶的每一行輸入會立即顯示在螢屏上,直到使用Ctrl+D快捷鍵提供給cat命令一個檔案結束符,

- 通過使用輸入重定向符號“<”可以讓程式從一個檔案中獲取輸入,

-
上面這條命令將檔案 test作為輸入傳遞給cat命令,cat讀取 test中的每一行,然后輸出讀到的內容,最后當cat遇到檔案結束符時,就停止讀取操作,整個程序同先前完全一致,
-
正如大家已經想到的,cat命令可以通過接受一個引數來顯示檔案內容,因此“cat <test”完全可以用cat test來替代,事實上,大部分命令都能夠以引數的形式在命令列上指定輸入檔的檔案名,因此輸入重定向并不經常使用,
-
另一種輸入重定向的例子被稱為立即檔案((here document)),這種重定向方式使用運算子“<<”,立即檔案明確告訴Shell從鍵盤接受輸入,并傳遞給程式,現在看下面這個例子:

-
cat命令從鍵盤接受兩行輸入,并將其送往標準輸出,和本節開頭的例子不同的是,立即檔案指定了一個代表輸入結束的分隔符 (在這里是單詞EOF),當Shell 遇到這個單詞的時候,即認為輸入結束,并把剛才的鍵盤輸入一起傳遞給命令,所以這次 cat命令會將用戶的輸入一塊顯示,而不是每收到一行就迫不及待地把它列印出來,
-
用戶可以選擇任意一個單詞作為立即檔案的分隔符,像
EOF、END、eof等都是不錯的選擇,只要可以確保它不是正文的一部分, -
那么,是否可以讓輸入重定向和輸出重定向結合在一起使用?這聽起來是一個不錯的主意,

- 這條命令首先讓 cat命令以立即檔案的方式獲取輸入,然后再把 cat 的輸出重定向到hello檔案,查看hello檔案,應該可以看到下面這些內容:

管道
- 管道將“重定向”再向前推進了一步,通過一根豎線“I”,將一條命令的輸出連接到另一條命令輸入,下面這條命令顯示了如何在檔案串列中查找檔案名中包含某個特定字串的檔案,

-
ls首先列出當前目錄下的所有檔案名,管道“I”接收到這些輸出,并把它們發送給grep命令作為其輸入,最后grep在這堆檔案串列中查找包含字串hello的檔案名,并在標準輸出(也就是顯示幕)顯示,
-
可以在一行命令中使用多個管道,從而構造出復雜的Shell 命令,最初這些命令可能看起來晦澀難懂,但它們的確很高效,合理使用管道是提高作業效率的有效手段,隨著使用的深入,大家會逐漸意識到這一點,
三.軟體包管理
- RPM(RedHat Package Manager),RedHat軟體包管理工具,類似windows里面的setup.exe, 是Linux這系列作業系統里面的打包安裝工具,它雖然是RedHat的標志,但理念是通用的,
1.rmp包的由來
-
軟體包的最原始的 形式肯定是原始碼的形式,rmp包是把別人寫好的原始碼包編譯好了存放成rpm這種格式了,這樣做有什么好處能,下次你要安裝的時候直接安裝rpm包就行,不用去重新編碼原始碼包了,那么通常都是誰來做原始碼包轉換成rpm包這個作業呢,一般都是各Linux發行版的官方,例如CentOS的官方,Redhat的官方,他們去把一些運行比較穩定的,bug比較少的原始碼包給你編譯成二進制形式的rpm包,以后有人要想使用這個軟體的時候,直接安裝rpm包就可以了,
-
我們經常看到官方發行的rpm版本都會比最新的原始碼包的版本滯后,為什么會滯后,因為官方都圖穩定,他們會把一些穩定的發布到自己的平臺上,如果你要使用最新最強大的功能,你只能去找原始碼包,但是需要注意的是,最新的原始碼包可能有許多bug,其實你自己也可以把原始碼包轉化成rpm包,
我們可以通過命令查看系統虛擬光碟中的rpm包

[root@localhost ~]# ls /run/media/root/CentOS\ 7\ x86_64/Packages/

2.操作rmp包
rmp包的命名格式 : Apache-1.3.23-11.i386.rpm
- “apache” 軟體名稱
- “1.3.23-11”軟體的版本號,主版本和此版本
- “i386”是軟體所運行的硬體平臺,Intel 32位微處理器的統稱
- “rpm”檔案擴展名,代表RPM包
查詢所安裝的所有rpm軟體包
rpm -qa

- 由于軟體包比較多,一般都會通過上面學到的 | 符進行過濾,比如我們想查詢firefox軟體的安裝情況,

rpm安裝命令
rpm -ivh RPM包全名
選項說明
| 選項 | 功能 |
|---|---|
| -i | install,安裝 |
| -v | verbose,顯示詳細資訊 |
| -h | hash,進度條 |
| –nodeps | 不檢測依賴進度 |
- 安裝firefox軟體

- 安裝完成后我們上客戶端看看

rpm卸載命令
rpm -e RPM軟體包
選項說明
| 選項 | 說明 |
|---|---|
| -e | 卸載軟體包 |
| –nodeps | 卸載軟體時,不檢查依賴,這樣的話,那些使用該軟體包的軟體在此之后可能就不能正常作業了, |
- 卸載firefox軟體

- 我們再來看一下我們的客戶端

3.什么是yum
- Yum是使用RPM軟體包管理器的Linux作業系統的免費開放源代碼命令列軟體包管理應用程式,Yum是rpm的前端工具,可自動解決軟體包的依賴性,它從發行官方存盤庫和其他第三方存盤庫安裝RPM軟體包,Yum允許您從系統中安裝、更新、搜索和洗掉軟體包,如果您想使系統保持最新,則可以通過yum-cron啟用自動更新,此外,如果需要,它還允許您從yum更新中排除一個或多個軟體包,默認情況下已安裝Yum,您無需安裝它,
4.yum和rpm的區別在哪里
| RPM | YUM |
|---|---|
| 紅帽于1997年推出了RPM | Yellowdog UPdater(YUP)于1999-2001年開發,YUM在2003年取代了原始的YUP實用程式 |
| RPM代表RPM軟體包管理器(以前稱為Red Hat軟體包管理器) | YUM代表經過修改的Yellowdog Updater |
| RPM檔案命名約定:httpd-2.4.6-92.el7.x86_64.rpm,即:httpd-實際軟體包的名稱,2.4.6-軟體包發行版本,92-Subversion包發行版,el7-紅帽版,x86_64-硬體架構,rpm-檔案擴展名 | 它在后端使用rpm資料庫 |
| 它不能解決依賴關系,您必須手動安裝它們 | 它會自動解決依賴關系并同時安裝它們(任何軟體包都將與其依賴關系一起安裝) |
| 這使您可以一次安裝該軟體包的多個版本 | 這不允許并且表明該軟體包已經安裝 |
| 使用RPM命令安裝軟體包時,必須提供“.rpm”軟體包的確切位置 | 您可以安裝存盤庫中可用的任何軟體包,但只需要知道軟體包名稱 |
| RPM不依賴YUM | 它是一個前端工具,使用后端上的RPM軟體包管理器來管理軟體包 |
| 在軟體包安裝方面很難管理RPM | YUM是管理RPM軟體包的最簡單方法 |
| RPM不允許您將整個系統升級到最新的可用版本 | YUM允許您將系統升級到最新的可用版本(次要版本升級,例如7.0到7.x) |
| RPM不允許您自動更新/升級系統上安裝的軟體包 | YUM允許您自動更新/升級系統上可用的更新 |
| 它不使用在線存盤庫執行任何操作 | 它完全依靠在線存盤庫來完成所有作業 |
| RPM是一種軟體包格式,它是執行基本操作的低級軟體包管理器 | 這是一個頂級的前端程式包管理工具,可以完成您需要的一切 |
5.yum倉庫配置
- 默認的系統YUM源,需要連接國外apache網站,網速比較慢,可以修改關聯的網路YUM源為國內鏡像的網站,比如網易163,

配置國內源
- 訪問該網路地址:http://mirrors.163.com/.help/centos.html,在使用說明中點擊CentOS6,再點擊保存


- 通過Xshell工具把下載的檔案上傳至指定的安裝位置(直接拉進來就上傳完成了),

- 把下載的檔案移動到/etc/yum.repos.d/目錄

- 備份CentOS-Base.rep并用CentOS6-Base-163.repo替換CentOS-Base.rep(這里備份就重新命名了,替換就是直接改為原檔案名稱)

- 清理舊快取資料,快取新資料,
yum clean all
yum makecache

安裝測驗

yum -y install firefox.x86_64

6.壓縮工具
- 經過壓縮后的檔案能夠占用更少的磁盤空間,現在幾乎所有的計算機用戶都懂得使用壓縮工具,盡管在大部分情況下是為了“打包”而不是“壓縮”,在 Linux 的世界里,有太多的源代碼需要壓縮,讀者將會看到這些壓縮工具的確非常有用,
壓縮檔案:gzip
- gzip是目前Linux下使用最廣泛的壓縮工具,盡管它的地位正持續受到bzip2的威脅,gzip 的使用非常方便,只要簡單地在 gzip命令后跟上一個想要壓縮的檔案作為引數就可以了,
gzip 檔案名

-
在默認情況下,gzip命令會給被壓縮的檔案加上一個“gz”擴展名,經過這番處理后,檔案badpro就變成了badpro.gz,
-
提示:“.tar.gz”可能是 Linux世界中最流行的壓縮檔案格式,這種格式的檔案是首先經過tar打包程式的處理,然后用gzip壓縮的成果, -
要解壓縮.gz檔案,可以使用gunzip命令或者帶“-d”選項的gzip命令,
gunzip 檔案名
或者
gzip -d 檔案名
-
應該保證需要解壓的檔案有合適的擴展名,gzip(或者gunzip)支持的擴展名有.gz、.Z、-gZ、.Z、-z和z,
-
gzip提供了-1選項用于查看壓縮效果,檔案的大小以位元組為單位,

-
可以看到,檔案badpro在壓縮前后的大小分別為158位元組(約幾kb),壓縮率為30.4%,
-
最后,gzip命令的-t選項可以用來測驗壓縮檔案的完整性,如果檔案正常,gzip命令不會給出任何顯示,如果一定要讓gzip 說點什么,可以使用-tv選項,

更高的壓縮率:bzip2
-
bzip2可以提供比 gzip更高的壓縮率,當然這是以壓縮速度為代價的,不過伴隨著摩爾定律驚人的持續性,這種速度上的劣勢將變得越來越難以察覺,bzip2以及類似的壓縮演算法也因此流行起來,
-
bzip2的使用方法同gzip基本一致,
bzip2 檔案名

- 解壓縮.bz2檔案可以使用bunzip2或者帶-d選項的bzip2命令:

或者
bzip2 -d 檔案名
-
bzip2可以識別的壓縮檔案格式包括.bz2、.bz、.tbz2、.tbz和 bzip2,如果使用bzip2壓縮的檔案不幸被改成了其他名字,那么經過解壓縮的檔案名后面會多出一個“.out”作為擴展名,
-
同樣可以使用-tv選項檢查壓縮檔案的完整性,
bzip2 -tv 檔案名
支持rar格式
-
rar儼然已經取代zip成為 Windows下的標準壓縮格式,盡管rar相比較zip最大的優勢在于其更好的壓縮效果,但Windows用戶通常只是簡單地把它作為打包工具,在Linux下處理rar檔案可以使用RAR for linux,這是一個命令列工具,可以從 www.rarlab.com/download.htm 上下載,
-
要解壓一個檔案,只要簡單地使用命令rar和選項x,
rar x 檔案名
四.用戶與用戶組管理
-
本章介紹Linux 上用戶和用戶組的管理,作為一種多用戶的作業系統,Linux 可以允許多個用戶同時登錄到系統上,并回應每一個用戶的請求,對于系統管理員而言,一個非常重要的作業就是對用戶賬戶進行管理,這些作業包括添加和洗掉用戶、分配用戶主目錄、限制用戶的權限等,接下來將逐一討論這些方面,
-
計算機科學還沒有進展到讓每一臺電腦都能通過生物學特征識別人的程度,在絕大多數情況下,用戶名是身份的唯一標志,計算機通過用戶提供的口令來驗證這一標志,這種簡單而實用的方式被廣泛應用于幾乎所有的計算機系統中,遺憾的是,也是由于這種“簡單”的驗證方式,使得在世界各地,每一天都有無數的賬號被盜取,因此選擇一個合適的用戶名和一個不易被破解的密碼非常重要,
-
Linux也運用同樣的方法來識別用戶:用戶提供用戶名和密碼,經過驗證后登錄到系統,Linux會為每一個用戶啟動一個行程,然后由這個行程接受用戶的各種請求,在建立用戶的時候,需要限定其權限,例如不能修改系統組態檔,不能查看其他用戶的目錄等,就像在一個銀行安全系統中,每一個人只能處理其職權范圍內的事情,另外,系統中有一個特殊的root 用戶,這個用戶有權對系統進行任何操作而不受限制,
-
所謂“人以群分”,可以把幾個用戶歸在一起,這樣的組被稱為“用戶組”,可以設定一個用戶組的權限,這樣這個組里的用戶就自動擁有了這些權限,對于一個多人協作的專案而言,定義一個包含專案成員的組往往是非常有用的,
-
在某些服務器程式安裝時,會生成一些特定的用戶和用戶組,用于對服務器進行管理,例如,可以使用mysql用戶啟動和停止MySQL服務器,之所以不使用root用戶啟動某些服務,主要是出于安全性的考慮,因為當某個運行中行程的UID屬于一個受限用戶的話,那么即使這個行程出了什么問題,也不會對系統安全產生毀滅性打擊,
1.為朋友 John 添加賬戶
-
fjn的筆記本送去維修了,希望借臺電腦用幾天,但是電腦上有一些私人檔案,或許不應該讓John看到,因此應該為fjn單獨添加一個賬戶,而不是使用當前系統上

已有的賬戶, -
打開終端,輸入:

注意,在輸入口令的時候,出于安全考慮,螢屏上并不會有任何顯示(包括“*”號),現在,應該把John叫過來,讓他自己輸入一個密碼,

- 現在,John可以使用自己的賬號登錄到系統了,只要將私人檔案設定為他人不可讀,那么就不用擔心John會查看到這些檔案,
2.添加用戶
- 添加用戶是系統管理的例行作業,在文章開頭大家已經實踐了添加用戶的基本步驟,接下來將詳細討論useradd和groupadd命令的各個常用選項,以及如何追蹤用戶狀態,
使用命令列工具:useradd 和 groupadd
- 在默認情況下,不帶-m引數的useradd命令不會為新用戶建立主目錄,在這種情況下,用戶可以登錄到系統的Shell,但不能夠登錄到圖形界面,這是因為桌面環境無論是 KDE還是GNOME,需要用到用戶主目錄中的一些組態檔,例如,以下面的方式使用useradd命令添加一個用戶nox,
useradd nox
passwd nox
-
當使用nox用戶賬號登錄GNOME 時,系統會提示無法找到用戶主目錄,并拒絕登錄,如果在字符界面的2號控制臺(可以使用快捷鍵Ctrl+Alt+F2進入)使用nox賬號登錄,系統會引導nox用戶進入根目錄,此后,用戶可以繼續操作.
-
useradd命令中另一個比較常用的引數是-g,該引數用于指定用戶所屬的組,下面這條命令建立名為mike的用戶賬號,并指定其屬于users組,
useradd -g users mike

-
在用戶建立的時候為其指定一個組看上去是一個很不錯的想法,但遺憾的是,這樣的設定增加了用戶由于不經意地設定權限而能夠彼此讀取檔案的可能性,盡管這通常不是用戶的本意,因此一個好的建議是,在新建用戶的時候用戶單獨創建一個同名的用戶組,然后把用戶歸入這個組中,這正是不帶-g 引數的useradd命令的默認行為,
-
useradd 的-s引數用于指定用戶登錄后所使用的Shell,下面的命令建立名為mike的用戶賬號,并指定其登錄后使用bash 作為Shell,
useradd -s /bin/bash mike
-
可以在/bin目錄下找到特定的Shell,常用的有BASH、TCSH、ZSH (Z-Shell) 、SH(Bourne Shell)等,如果不指定-s 引數,那么默認將使用sh(在大部分系統中,這是指向BASH的符號鏈接)登錄系統,
-
添加組可以使用groupadd命令,下面這條命令在系統中添加一個名為newgroup 的組,
groupadd newgroup
記錄用戶操作:history
- Linux,準確地說是Shell,會記錄用戶的每一條命令,通過history命令,用戶可以看到自己曾經執行的操作,

注意: history命令僅在 BASH中適用,
- history會列出所有使用過的命令并加以編號,這些資訊被存盤在用戶主目錄的.bash_history檔案中,這個檔案默認情況下可以存盤1000條命令記錄,當然,一次列出那么多命令除了讓人迷茫外,沒有其他什么用途,為此,可以指定讓history列出最近幾次輸入的命令,

- 但是,history只能列出當前用戶的操作記錄,對于管理員而言,有時候需要查看其他用戶的操作記錄,此時可以讀取該用戶主目錄下的.bash_history檔案,現在看看john都干了些什么,

注意:.bash_history這個檔案對于其他受限用戶是不可讀的,
直接編輯 passwd 和 shadow檔案
-
在Linux 中所做的一切基本配置最終都將反映到組態檔中,用戶管理也不例外,所有的用戶資訊都登記在/etc/passwd檔案中,而/etc/shadow檔案則保存著用戶的登錄密碼,
-
諸如useradd這樣的工具實際上對用戶隱藏了用戶管理的細節,可以通過手動編輯passwd和 shadow這兩個檔案實作 useradd 等工具的所有功能,其中,passwd檔案對所有用戶可讀,而 shadow則只能用root賬號查看,為了保證口令的安全性,這一點很容易理解,當然,修改這兩個檔案都需要root權限,
3.洗掉用戶:userdel
- userdel命令用于洗掉用戶賬號,下面這條命令洗掉mike這個賬號,

- 可以看到 在默認情況下,userdel并不會洗掉用戶的主目錄,除非使用了-r選項, 下面這條命令將john的賬號洗掉,同時洗掉其主目錄,

- 在洗掉用戶的同時洗掉其主目錄,以釋放硬碟空間,這看起來無可厚非,但是,在輸入-r選項之前,仍然有一個問題需要問問自己:需要這么著急嗎?如果被洗掉的用戶又要恢復,或者用戶的某些檔案還需要使用(這樣的情況在服務器上經常出現)那么有必要暫時保留這些檔案,比較妥當的方法是,將被刪用戶的主目錄保留幾周,然后再手動洗掉,在實際的作業環境中,這個做法顯得尤為重要,
4.管理用戶賬號:usermod
- 可以使用usermod 命令來修改已有的用戶賬號,這個命令有多個不同的選項,對應于賬號的各個屬性,如表9.1列舉了usermod命令的各個常用選項及其含義,
| 選項 | 含義 |
|---|---|
| -d | 修改用戶主目錄 |
| -e | 修改賬號的有效期限,以公元月/日/年的形式表示(MM/DD/YY) |
| -g | 修改用戶所屬組 |
| -l | 修改用戶賬號名稱 |
| -s | 修改用戶登陸后所使用的Shell |
- 下面這條命令將zll改名為mike2,主目錄改為/home/mike2,并設定賬號有效期至2022年12月31日,

- 和 useradd的原理一樣,usermod也通過修改/etc/passwd、/etc/shadow和/etc/group這3個檔案來實作用戶屬性的設定,
5.查看用戶資訊:id
- id命令用于查看用戶的UID、GID及其所屬的組,這個命令以用戶名作為引數,下面這條命令顯示了nobody用戶的UID、GID及其屬于的組資訊,

- 使用不帶任何引數的id命令顯示當前登錄用戶的資訊,

6.用戶間切換:su
-
前面文章中曾經介紹過,使用root賬號一個比較好的做法是使用su 命令,不帶任何引數的su命令會將用戶提升至root權限,當然首先需要提供root 口令,通過su命令所獲得的特權將一直持續到使用exit命令退出為止,
-
也可以使用su命令切換到其他用戶,下面這個命令將當前身份轉變為mzc,

-
系統會要求輸入mzc口令,通過驗證后,就可以訪問mzc賬號了,通過 exit 命令回到之前的賬號,
-
安全性提示: 盡量通過絕對路徑使用su命令,這個命令通常保存在/bin目錄下,這將在一定程度上防止溜入到搜索路徑下的名為su的程式竊取用戶口令,
五.行程管理
- 無論是系統管理員還是普通用戶,監視系統行程的運行情況,并適時終止一些失控的行程是每天的例行事務(讀者或許對Windows的任務管理器非常熟悉),系統管理員可能還要兼顧到任務的重要程度,并相應調整行程的優先級策略,無論是哪一種情況,本文都會有所幫助,本文的任務將完全在 Shell中完成,
1.結束一個失控的程式
- 終止一個失控的應用程式或許是用戶最常使用的“行程管理”任務,盡管沒有人愿意經常執行這樣的“管理”,為了模擬這個情況,本節手動構建了一個程式,這個古老而有名的“惡作劇”程式在 Shell 中不停地創建目錄和檔案,如果不趕快終止,那么它將在系統中創建一棵很深的目錄樹,

#! /bin/bash
while echo "I'm making files!!"
do
mkdir adir
cd adir
touch afile
sleep 5s
done
-
這是一個Shell腳本,現在并沒有必要搞清楚其中的每一句話,后面文章會詳細介紹Shell編程,如果讀者曾經接觸過一門編程語言,應該能夠大致看出這個程式做了些什么,為了讓這個惡作劇表現得盡可能“溫和”,這里讓它在每次建完目錄和檔案后休息5秒鐘,
-
將這個檔案加上可執行權限,并從后臺執行,

注意:運行這個程式存在一些風險,千萬不要漏了sleep 5s這一行,否則創建的目錄樹的深度會很快超出系統的允許范圍,在這種情況下,讀者可能必須要使用rm -fr adir 來洗掉這些“垃圾”目錄,
- 為什么要從后臺運行?原因只有一個,即迫使自己使用kill命令殺死這個行程,

- 現在程式已經運行起來了,可以看到它在終端不停地輸出I’m making files!!,打開另一個終端,運行ps命令查看這個程式的PID號(PID號用于唯一表示一個行程),

-
這里為了方便尋找,使用了管道配合grep命令,在ps命令的輸出中,第2個欄位就是行程的PID號,通過最后一個欄位可以判斷出 58250是屬于這個失控行程,
-
使用 kill 命令“殺死這個行程”,

- 回到剛才那個運行badpro 的終端,可以看到這個程式已經被終止了,最后不要忘記把這個程式建立的目錄和檔案洗掉(當然,讀者如果非常好奇,可以到這個目錄中看一看),


2.什么是行程
- 看似簡單的概念往往很難給出定義,一個比較“正規”的說法是:行程是作業系統的一種抽象概念,用來表示正在運行的程式,其實,讀者可以簡單地把行程理解為正在運行的程式,Linux是一種多用戶、多行程的作業系統,在 Linux的內核中,維護著一張表,這張表記錄了當前系統中運行的所有行程的各種資訊,Linux 內核會自動完成對行程的控制和調度——當然,這是所有作業系統都必須擁有的基本功能,內核中一些重要的行程資訊如下:
- 行程的記憶體地址;
- 行程當前的狀態;
- 行程正在使用的資源;
- 行程的優先級(謙讓度);
- 行程的屬主,
- Linux提供了讓用戶可以對行程進行監視和控制的工具,在這方面,Linux對系統行程和用戶行程一視同仁,使用戶能夠用一套工具控制這兩種行程,
3.行程的屬性
- 一個行程包含有多個屬性引數,這些引數決定了行程被處理的先后順序、能夠訪問的資源等,這些資訊對于系統管理員和程式員都非常重要,下面討論幾個常用的引數,其中的一些引數大家可能已經有所接觸了,
PID:行程的ID號
-
系統為每個用戶都分配了用于標識其身份的ID號(UID),同樣地,行程也有這樣一個D號,被稱作PID,用ID確定行程的方法是非常有好處的——對于計算機而言,認識數字永遠比認識一串字符方便得多,Linux沒有必要去理解那些對人類非常“有意義”的行程名,
-
Linux 不僅自己使用PID來確定行程,還要求用戶在管理行程時也提供相應的PID號,幾乎所有的行程管理工具都接受PID號,而不是行程名,這也是為什么在“快速上手”環節中必需要使用ps命令獲得PID號的原因,
PPID:父行程的PID
-
在Linux 中,所有的行程都必須由另一個行程創建——除了在系統引導時,由內核自主創建并安裝的那幾個行程,當一個行程被創建時,創建它的那個行程被稱作父行程,而這個行程則相應地被稱作子行程,子行程使用 PPID 指出誰是其“父親”,很容易可以理解,PPID就等于其父行程的PID,
-
在剛才的敘述中,多次用到了“創建”這個詞,這是出于表述和理解上的方便,事實上在 Linux中,行程是不能被“憑空”創建的,也就是說,Linux 并沒有提供一種系統呼叫讓應用程式“創建”一個行程,應用程式只能通過克隆自己來產生新行程,因此,子行程應該是其父行程的克隆體,這種說法聽起來的確有點讓人困惑,不過不要緊,這些概念只是對Linux程式員非常重要,大家如果對此感興趣,可以參考Linux編程方面的書籍,
UID和 EUID:真實和有效的用戶ID
-
只有行程的創建者和root用戶才有權利對該行程進行操作,于是,記錄一個行程的創建者(也就是屬主)就顯得非常必要,行程的UID就是其創建者的用戶ID號,用于標識行程的屬主,
-
Linux還為行程保存了一個“有效用戶ID號”,被稱作EUID,這個特殊的UID號用來確定行程對某些資源和檔案的訪問權限,在絕大部分情況下,行程的UID和EUID是一樣的——除了著名的setuid程式,
-
什么是setuid程式?上文中的passwd命令,這個命令允許用戶修改自己的登錄口令,但讀者是否考慮過這個問題:密碼保存在/etc/shadow檔案中,這個檔案對普通用戶是不可讀的,那么用戶怎么能夠通過修改shadow檔案來修改自己的口令呢?這就是setuid的妙處了,通過使passwd在執行階段具有檔案所有者(也就是root)的權限,讓用戶臨時有了修改shadow檔案的能力(當然這種能力是受到限制的),因此,passwd就是一個典型的setuid程式,其UID是當前執行這個命令的用戶ID,而EUID則是root用戶的ID(也就是0),
-
除此之外,Linux還給行程分配了其他幾個UID,例如 saved UID和FSUID,這種多UID體系的設定非常耐人尋味,對它的解釋超出了本文的范圍,有興趣的小伙伴們可以自己查閱相關資料,
謙讓度和優先級
-
顧名思義,行程的優先級決定了其受到CPU“優待”的程度,優先級高的行程能夠更早地被處理,并獲得更多的處理器時間,Linux內核會綜合考慮一個行程的各種因素來決定其優先級,這些因素包括行程已經消耗的CPU時間、行程已經等待的時間等,在絕大多數情況下,決定行程何時被處理是內核的事情,不需要用戶插手,
-
用戶可以通過設定行程的“謙讓度”來影響內核的想法,“謙讓度”和“優先級”剛好是一對相反的概念,高“謙讓度”意味著低“優先級”,反之亦然,需要注意的是,行程管理工具讓用戶設定的總是“謙讓度”,而不是“優先級”,如果希望讓一個行程更早地被處理,那么應該把它的謙讓度設定得低一些,使其變得不那么“謙讓”,關于如何設定謙讓度,參考后面文章,
4.監視行程:ps命令
-
ps是最常用的監視行程的命令,這個命令給出了有關行程的所有有用資訊,在“快速上手”環節,讀者已經使用了這個命令,本節將給出這個命令的詳細解釋,
-
ps命令有多種不同的使用方法,這常常給初學者帶來困惑,在各種Linux 論壇上,詢問ps命令語法的帖子屢見不鮮,之所以會出現這樣的情況,只能歸咎于UNIX“悠久”的歷史和龐雜的派系,在不同的UNIX變體上,ps命令的語法各不相同,Linux為此采取了一個折中的處理方式,即融合各種不同的風格,目的只是為了兼顧那些已經習慣了其他系統上ps命令的用戶(盡管這種兼顧現在看起來似乎越來越沒有必要了)),
-
幸運的是,普通用戶根本不需要理會這些,這是內核開發人員應該考慮的事情,在絕大多數情況下,只需要用一種方式使用ps命令就可以了,

- ps aux命令用于顯示當前系統上運行的所有行程的資訊,出于篇幅考慮,這里只選取了部分行,
| 欄位 | 含義 |
|---|---|
| USER | 行程創建者的用戶名 |
| PID | 行程的ID號 |
| %CPU | 行程占用的CPU百分比 |
| %MEM | 行程占用的記憶體百分比 |
| VSZ | 行程占用的虛擬記憶體大小 |
| RSS | 記憶體中頁的數量(頁是管理記憶體的單位,在PC上通常為4K) |
| TTY | 行程所在終端的ID號 |
| STAT | 行程狀態,常用字母代表的含義如下:R 正在運行/可運行,D 睡眠中(不可被喚醒,通常是在等待I/O設備),S 睡眠中(可被喚醒),T 停止(由于收到信號或被跟蹤),Z 僵行程(已經結束而沒有釋放系統資源的行程)常用的附加標志有:< 行程擁有比普通優先級高的優先級,N 行程擁有比普通優先級低的優先級,L 有些頁面被鎖在記憶體中 s 會話的先導行程 |
- ps的另一組選項lax可以提供父行程ID(PPID)和謙讓度(NI),ps lax 命令不會顯示行程屬主的用戶名,因此可以提供更快的運行速度(ps aux需要把UID轉換為用戶名后才輸出),ps lax命令的輸出如下:

5.即時跟蹤行程資訊: top命令
- ps命令可以一次性給出當前系統中行程資訊的快照,但這樣的資訊往往缺乏時效性,當管理員需要實時監視行程運行情況時,就必須不停地執行ps命令——這顯然是缺乏效率的,為此,Linux提供了top命令用于即時跟蹤當前系統中行程的情況,

- top命令顯示的資訊會占滿一頁,并且在默認情況下每10s更新一次,那些使用CPU最多的程式會排在最前面,用戶還可以即時觀察到當前系統CPU使用率、記憶體占有率等各種資訊,最后,使用命令q退出這個監視程式,
6.查看占用檔案的行程:lsof
- 管理員有時候想要知道某個特定的檔案正被哪些行程使用,lsof命令能夠提供包括PID在內的各種行程資訊,不帶任何引數的lsof命令會列出當前系統中所有打開檔案的行程資訊,要找出占用某個特定檔案的行程,需要提供檔案名作為引數,
lsof 檔案名
7.向行程發送信號:kill
- 看起來,kill命令總是用來“殺死”一個行程,但事實上,這個名字或多或少帶有一定的誤導性,從本質上講,kill命令只是用來向行程發送一個信號,至于這個信號是什么,則是由用戶指定的,kill命令的標準語法如下:
kill [-signal] pid
- Linux定義了幾十種不同型別的信號,可以使用kill -1命令顯示所有信號及其編號,根據硬體體系結構的不同,下面這張串列會有所不同,

- 千萬不要被這一堆字符嚇到,在絕大多數情況下,這些信號中的絕大多數不會被使用,
常用的信號

注意:信號名的前綴SIG是可以省略的,也就是說,SIGTERM和TERM這兩種寫法kill命令都可以理解,
-
在默認情況下,kill命令向行程發送TERM信號,這個信號表示請求終止某項操作,
-
請回憶在“結束一個失控的程式”環節中使用的命令kill 58250,這實際上等同于下面這條命令:
kill -TERM 58250
或
kill -SIGTERM 58250
- 但是,使用kill命令是否一定可以終止一個行程?答案是否定的,既然 kill 命令向程式“發送”一個信號,那么這個信號就應該能夠被程式“捕捉”,程式可以“封鎖”或者干脆“忽略”捕捉到的信號,只有在信號沒有被程式捕捉的情況下,系統才會執行默認操作,作為例子,來看一下bc程式(一個基于命令列的計算器程式),

-
Linux中,快捷鍵Ctrl+C對應于信號INT,在這個例子中,bc程式捕捉并忽略了這個信號,并告訴用戶應該使用quit命令退出應用程式,
-
這就意味著,只要本章開頭的那個badpro程式能夠忽略TERM信號,那么kill -TERM命令將對它不起作用,加入這個“功能”非常容易,只要把程式改成下面這樣就可以了,
#! /bin/bash
trap "" TERM
while echo "I'm making files!!"
do
mkdir adir
cd adir
touch afile
sleep 5s
done
- 大家應該已經猜到了,這里新加入的命令“trap"" TERM”用于忽略TERM信號,建議大家在閱讀完下一段之前先不要運行這個程式,否則將可能陷入無法終止它的尷尬境地,
- 幸運的是,有一個信號永遠不能被程式所捕捉,這就是KILL信號,KILL可以在內核級別“殺死”一個行程,在絕大多數情況下,下面這條命令可以確保結束行程號為pid 的行程,
kill -KILL pid
或
kill -SIGKILL pid
或
kill -9 pid
- 然而,有一些行程的生命力是如此“頑強”,以至于KILL信號都不能影響到它們,這種情況常常是由一些退化的IO(輸入/輸出)虛假鎖定造成的,此時,重新啟動系統是解決問題的唯一方法,

- 整理不易,感謝大家觀看,希望大家踴躍投票并在評論區給出您寶貴的建議,您的支持就是我更新最大的動力!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296697.html
標籤:其他
上一篇:對剛裝好系統的Linux系統配置軟體開發生產環境,讓你開發效率一飛沖天!
下一篇:ssl證書需要幾級域名
