Slackware啟動指令碼與System V啟動指令碼的區別何在?(轉)
Slackware版本:Slackware 7.0及以上
Slackware 使用BSD風格的init指令碼,而很多別的發行版使用System V風格的init指令碼。SysV和BSD指令碼都是能讓人讀懂的,即它們都是shell指令碼,而不是已編譯的程式。主要的區別在於指令碼是如何設計的。
SysV指令碼傾向於接受諸如start、stop、restart之類的引數,依它所啟動的程式而定。所以你可以用 /etc/init.d/bind start 這樣的命令來啟動BIND,並用 /etc/init.d/bind stop 來停止BIND。
SysV的啟動還傾向於使用符號連結來組織啟動程式,例如在 /etc/rc.d/rc.4/中,可能會有指向別的目錄中的真正的指令碼的各種各樣的符號連結。這些連結的命令會像是 S10network、S25xdm之類,其中的S表示啟動(start)該項服務(如果是K,則表示kill),而數字指定了指令碼執行的順序。
SysV風格的啟動指令碼的主要優點在於能夠設定成自動配置許多東西。例如,若你進入runlevel 6,你可以建立一個連結叫K75bind來終止BIND,前提是連結所指向的檔案已經設定好來做這件事。
SysV風格指令碼的主要缺點是太過彎彎繞。假如我想增加一個服務,我要先寫一個SysV風格的指令碼(不是容易的事),它至少要處理“start”(還可能有“stop”)。然後,我必須確保在每個要執行這個服務的runlevel中正確地設定好符號連結。如果恰好這個服務需要在已經連續編號的兩個指令碼之間執行,我就需要做一些對符號連結重新編號的工作(例如,S10xxx和S11yyy已經存在,而我想讓zzzz在它們之間執行,我就需要對前兩者之一重新建立符號連結來把zzzz擠進去)。
想暫時改變SysV的啟動程式也是非常痛苦的事情。假如我不想在下次啟動時執行xxx服務,最簡單的辦法是刪除S10xxx這個連結,不算難吧?但如果我想在每個runlevel中都去掉它,我就需要從每個有關目錄中刪除S10xxx這個連結。然後,假如我改了主意,想重新執行xxx,我需要手工重新建立所有的符號連結。
這樣子無疑是在已經很複雜的啟動程式上疊床架屋,而Slackware是不會這麼做的:它用BSD風格的啟動指令碼。
BSD風格的指令碼是直接了當的shell指令碼,它們傾向於順序執行,而不需要start或stop之類引數。只要系統進入了它們的runlevel就會執行,就這麼簡單。
BSD風格的主要缺點是你需要一些其他方法來控制後臺服務。例如,若我要停止BIND,我要先用命令 ps ax|grep named 找出 named的PID,然後kill這個PID(或者用這個pid的檔名)。但是我不能簡單地下個命令 /etc/init.d/bind stop (除非我已經寫了個這樣的SysV指令碼)。
BSD風格指令碼的主要優點是它們非常容易閱讀和編輯。例如,若我想增加一個服務zzzz,我可以在 /etc/rd.d/rc.local中增加一行 /usr/local/bin/zzzz,這樣只要是執行rc.local的runlevel,zzzz就會隨之執行。假如我只想在runlevel 4執行zzzz,我可以把它放在 /etc/rc.d/rc.4 (不是目錄,而是一個指令碼)中。如果我要改變執行順序,我只要把zzzz放在適當的服務之間,多數編輯器都支援在檔案中間插入文字(就算ed都支援)。還有,你可以用註釋的方式停止一個服務,然後去掉註釋讓它重新執行。
因此,當多數發行版採用SysV風格時,Slackware採用了BSD風格。對於許多Slackware使用者,BSD風格的易用性勝過SysV風格的強大功能。當然,你可以有自己的意見。
與普遍的觀點相反,從一種風格轉到另一種並不那麼困難,只要把inittab和rc檔案從一個系統複製到另一個系統即可。init程式自身沒有改變,所謂“風格”多是在inittab和它所呼叫的指令碼中設定的。
譯註:現在slackware為了提高相容性,在/etc/rc.d/提供了rc.sysvinit指令碼以適應某些基於SysV啟動過程的商業程式的需要。另外,在許多設定服務的指令碼中,也接受start、stop、restart這一類引數,例如rc.sendmail、rc.sshd等。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-941359/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CentOS的System V init啟動指令碼CentOS指令碼
- httpd啟動指令碼httpd指令碼
- MacOS 啟動 -- Redis指令碼MacRedis指令碼
- Uboot連結指令碼與啟動流程boot指令碼
- 如何在Docker容器啟動時自動執行指令碼Docker指令碼
- Ubuntu自動啟動配置指令碼Ubuntu指令碼
- Rabbitmq 開機啟動指令碼MQ指令碼
- centos 自動啟動指令碼和自啟動服務CentOS指令碼
- 專案啟動指令碼的編寫指令碼
- Centos7 啟動 python指令碼CentOSPython指令碼
- storm叢集啟動停止指令碼ORM指令碼
- 105-指令碼啟動網路指令碼
- CentOS7 nginx啟動指令碼CentOSNginx指令碼
- MYSQL Slave開機啟動指令碼MySql指令碼
- 指令碼快速啟動工具:FastScripts for mac指令碼ASTMac
- Linux 新增指令碼開機自啟動Linux指令碼
- springboot的jar在linux上sh啟動指令碼Spring BootJARLinux指令碼
- 記windows自定義bat指令碼自啟動WindowsBAT指令碼
- linux系統軟體啟動sh指令碼Linux指令碼
- Ubuntu 設定開機自啟動指令碼Ubuntu指令碼
- 多臺kafka同時啟動shell指令碼Kafka指令碼
- Shell指令碼控制docker容器啟動順序指令碼Docker
- Mac生成APP圖示和啟動圖的指令碼MacAPP指令碼
- Oracle Restart環境下的開機啟動指令碼OracleREST指令碼
- .net 程式通過 crontab 無法啟動,手動執行指令碼可以啟動指令碼
- 設定msyqlphp-fpm開機自動啟動指令碼PHP指令碼
- nginx重啟指令碼Nginx指令碼
- ubuntu-18.04 設定開機啟動指令碼Ubuntu指令碼
- Shell指令碼 | 效能測試之啟動時間指令碼
- shell指令碼監控啟動停止weblogic服務指令碼Web
- ubuntu14 設定開機啟動指令碼Ubuntu指令碼
- linux設定開機自啟動指令碼的最佳方式Linux指令碼
- Linux(CentOS)啟動時自動執行指令碼(rc.local)LinuxCentOS指令碼
- Tomcat的啟停指令碼原始碼解析Tomcat指令碼原始碼
- Centos學習筆記14 – java程式啟動指令碼CentOS筆記Java指令碼
- linux下啟動和終止JAVA程式shell指令碼LinuxJava指令碼
- Windows使用bat指令碼指定jdk版本啟動jar包WindowsBAT指令碼JDKJAR
- SOLIDWORKS啟動時出現指令碼錯誤問題Solid指令碼
- 一個簡單的Linux啟動jar包的shell指令碼LinuxJAR指令碼