Linux

linux啟動過程中shell什麼時候執行

  • April 14, 2014

我不明白 shell 什麼時候執行,比如說 bash,哪個程序首先執行 bash。

linux/unix 的啟動順序有很多階段,本站有很多參考資料和解答詳細說明。但總結一下;

最終核心載入了驅動程序,以便可以使用磁碟和設備,然後它以pid(程序 ID)為 1 啟動程序。

傳統上,這個程序是一個名為的程序,init但今天有幾個更新的程序(systemdupstart)。這取決於您使用的發行版和版本。

啟動是一個分層的過程。

存在升級執行級別(1、2、3、4、5、6 …)的概念,啟動程序將在這些級別之間自動或分階段切換(以便使用者獲得控制權)。

  1. 作為初始步驟(單使用者模式),
  2. 多使用者模式,
  3. 多使用者聯網
  4. GUI mode …
  5. .. 6., …

這些執行級別也不是一成不變的,它們取決於正在使用的分發和啟動程序(init、systemd、…)和約定。

級別還取決於分階段啟動/關閉模式的設計方式。(想想看,Linux 用於路由器、安卓手機、伺服器和台式機,都有不同的要求)。

為了從一個執行級別跨越到另一個執行級別,各種其他程序(服務),如綁定(用於 DNS)、網路、路由、網路伺服器,……被啟動或停止,然後bash可用於執行特定腳本,該腳本啟動或停止服務。

最終,您需要在控制台或圖形界面登錄,並且可能會提示您輸入使用者名和密碼。

讓我們採取一個簡單的路線,假設您在一個非圖形控制台上,並且 login程序正在提示您進行身份驗證。當您通過時,它將讀取為輸入的使用者名配置的 shell/etc/passwd並啟動它,輸入和輸出設置到您的控制台,然後您有提示並可以開始工作。所以在這種情況下,

init starts -> login which starts -> bash

所以每個程序都是第一個程序的子程序,(更準確地說,每個程序都有 pid 1 作為祖先)。在上面的範例中, shelllogin是否將exec登錄程序替換為 bash,程序 ID 不會改變。當你看ps它時,看起來 bash 是由 init 啟動的,因為它的父 pid 是 1,但是有一系列事件。

在控制台上啟動 bash 並沒有什麼真正的停止pid 1(如果 pid 1 可以計算出此時控制台是什麼),這取決於啟動順序的設計方式。(我不得不這樣做一次,但這不是正常的做法)。

引用自:https://unix.stackexchange.com/questions/118377