天天看點

RHCSA 系列(五): RHEL7 中的程序管理:開機,關機

我們将概括和簡要地複習從你按開機按鈕來打開你的 rhel 7 伺服器到呈現出指令行界面的登入螢幕之間所發生的所有事情,以此來作為這篇文章的開始。

RHCSA 系列(五): RHEL7 中的程式管理:開機,關機

linux 開機過程

請注意:

相同的基本原則也可以應用到其他的 linux 發行版本中,但可能需要較小的更改,并且

下面的描述并不是旨在給出開機過程的一個詳盡的解釋,而隻是介紹一些基礎的東西

<a target="_blank"></a>

初始化 post(加電自檢)并執行硬體檢查;

當 post 完成後,系統的控制權将移交給啟動管理器的第一階段first stage,它存儲在一個硬碟的引導扇區(對于使用 bios 和 mbr 的舊式的系統而言)或存儲在一個專門的 (u)efi 分區上。

啟動管理器的第一階段完成後,接着進入啟動管理器的第二階段second stage,通常大多數使用的是 grub(grand unified boot loader 的簡稱),它駐留在 <code>/boot</code> 中,然後開始加載核心和駐留在 ram 中的初始化檔案系統(被稱為 initramfs,它包含執行必要操作所需要的程式和二進制檔案,以此來最終挂載真實的根檔案系統)。

接着展示了閃屏splash過後,呈現在我們眼前的是類似下圖的畫面,它允許我們選擇一個作業系統和核心來啟動:

RHCSA 系列(五): RHEL7 中的程式管理:開機,關機

啟動菜單螢幕

核心會對接入到系統的硬體進行設定,當根檔案系統被挂載後,接着便啟動 pid 為 1 的程序,這個程序将開始初始化其他的程序并最終呈現給我們一個登入提示符界面。

RHCSA 系列(五): RHEL7 中的程式管理:開機,關機

登入螢幕和程序的 pid

在上面的例子中,我們使用了大家熟知的 <code>ps</code> 指令來顯示在系統啟動過程中的一系列目前程序的資訊,它們的父程序(或者換句話說,就是那個開啟這些程序的程序)為 systemd(大多數現代的 linux 發行版本已經切換到的系統和服務管理器):

<code># ps -o ppid,pid,uname,comm --ppid=1</code>

記住 <code>-o</code>(為 -format 的簡寫)選項允許你以一個自定義的格式來顯示 ps 的輸出,以此來滿足你的需求;這個自定義格式使用 <code>man ps</code> 裡 standard format specifiers 一節中的特定關鍵詞。

另一個你想自定義 ps 的輸出而不是使用其預設輸出的情形是:當你需要找到引起 cpu 或記憶體消耗過多的那些程序,并按照下列方式來對它們進行排序時:

<code># ps aux --sort=+pcpu # 以 %cpu 來排序(增序)</code>

<code># ps aux --sort=-pcpu # 以 %cpu 來排序(降序)</code>

<code># ps aux --sort=+pmem # 以 %mem 來排序(增序)</code>

<code># ps aux --sort=-pmem # 以 %mem 來排序(降序)</code>

<code># ps aux --sort=+pcpu,-pmem # 結合 %cpu (增序) 和 %mem (降序)來排列</code>

RHCSA 系列(五): RHEL7 中的程式管理:開機,關機

自定義 ps 指令的輸出

在 linux 世界中,很少有能比在主流的 linux 發行版本中采用 systemd 引起更多的争論的決定。systemd 的倡導者根據以下事實來表明其主要的優勢:

在系統啟動期間,systemd 允許并發地啟動更多的程序(相比于先前的 sysvinit,sysvinit 似乎總是表現得更慢,因為它一個接一個地啟動程序,檢查一個程序是否依賴于另一個程序,然後等待守護程序啟動才可以啟動的更多的服務),并且

在一個運作着的系統中,它用作一個動态的資料總管。這樣在啟動期間,當一個服務被需要時,才啟動它(以此來避免消耗系統資源)而不是在沒有一個合理的原因的情況下啟動額外的服務。

向後相容 sysvinit 的腳本。

systemd 由 systemctl 工具控制,假如你了解 sysvinit,你将會對以下的内容感到熟悉:

service 工具,在舊一點的系統中,它被用來管理 sysvinit 腳本,以及

chkconfig 工具,為系統服務更新和查詢運作級别資訊

shutdown 你一定使用過幾次來重新開機或關閉一個運作的系統。

下面的表格展示了使用傳統的工具和 systemctl 之間的相似之處:

舊式工具

systemctl 等價指令

描述

service name start

systemctl start name

啟動 name (這裡 name 是一個服務)

service name stop

systemctl stop name

停止 name

service name condrestart

systemctl try-restart name

重新開機 name (如果它已經運作了)

service name restart

systemctl restart name

重新開機 name

service name reload

systemctl reload name

重載 name 的配置

service name status

systemctl status name

顯示 name 的目前狀态

service - status-all

systemctl

顯示目前所有服務的狀态

chkconfig name on

systemctl enable name

通過一個特定的單元檔案,讓 name 可以在系統啟動時運作(這個檔案是一個符号連結)。啟用或禁用一個啟動時的程序,實際上是增加或移除一個到 /etc/systemd/system 目錄中的符号連結。

chkconfig name off

systemctl disable name

通過一個特定的單元檔案,讓 name 可以在系統啟動時禁止運作(這個檔案是一個符号連結)。

chkconfig -list name

systemctl is-enabled name

确定 name (一個特定的服務)目前是否啟用。

chkconfig - list

systemctl - type=service

顯示所有的服務及其是否啟用或禁用。

shutdown -h now

systemctl poweroff

關機

shutdown -r now

systemctl reboot

重新開機系統

systemd 也引進了單元(unit)(它可能是一個服務,一個挂載點,一個裝置或者一個網絡套接字)和目标(target)(它們定義了 systemd 如何去管理和同時開啟幾個相關的程序,可以認為它們與在基于 sysvinit 的系統中的運作級别等價,盡管事實上它們并不等價)的概念。

其他與程序管理相關,但并不僅限于下面所列的功能的任務有:

1. 在考慮到系統資源的使用上,調整一個程序的執行優先級:

這是通過 <code>renice</code> 工具來完成的,它可以改變一個或多個正在運作着的程序的排程優先級。簡單來說,排程優先級是一個允許核心(目前隻支援 &gt;= 2.6 的版本)根據某個給定程序被配置設定的執行優先級(即友善度(niceness),從 -20 到 19)來為其配置設定系統資源的功能。

<code>renice</code> 的基本文法如下:

<code># renice [-n] priority [-gpu] identifier</code>

在上面的通用指令中,第一個參數是将要使用的優先級數值,而另一個參數可以是程序 id(這是預設的設定),程序組 id,使用者 id 或者使用者名。一個正常的使用者(即除 root 以外的使用者)隻可以更改他或她所擁有的程序的排程優先級,并且隻能增加友善度的層次(這意味着占用更少的系統資源)。

RHCSA 系列(五): RHEL7 中的程式管理:開機,關機

程序排程優先級

2. 按照需要殺死一個程序(或終止其正常執行):

這兩個工具的不同之處在于前一個被用來終止一個特定的程序或一個程序組,而後一個則允許你通過程序的名稱和其他屬性,執行相同的動作。

另外, pkill 與 pgrep 相捆綁,pgrep 提供将受符合的程序的 pid 給 pkill 來使用。例如,在運作下面的指令之前:

<code># pkill -u gacanepa</code>

檢視一眼由 gacanepa 所擁有的 pid 或許會帶來點幫助:

<code># pgrep -l -u gacanepa</code>

RHCSA 系列(五): RHEL7 中的程式管理:開機,關機

找到使用者擁有的 pid

預設情況下,kill 和 pkiill 都發送 sigterm 信号給程序,如我們上面提到的那樣,這個信号可以被忽略(即該程序可能會終止其自身的執行,也可能不終止),是以當你因一個合理的理由要真正地停止一個運作着的程序,則你将需要在指令行中帶上特定的 sigkill 信号:

<code># kill -9 identifier # 殺死一個程序或一個程序組</code>

<code># kill -s signal identifier # 同上</code>

<code># pkill -s signal identifier # 通過名稱或其他屬性來殺死一個程序</code>

在這篇文章中,我們解釋了在 rhel 7 系統中,有關開機啟動過程的基本知識,并分析了一些可用的工具來幫助你通過使用一般的程式和 systemd 特有的指令來管理程序。

請注意,這個清單并不旨在涵蓋有關這個話題的所有花哨的工具,請随意使用下面的評論欄來添加你自已鐘愛的工具和指令。同時歡迎你的提問和其他的評論。

本文來自雲栖社群合作夥伴“linux中國”,原文釋出日期:2015-09-18

繼續閱讀