ubuntu 啓動運行腳本 開機啓動腳本

http://blog.sina.com.cn/s/blog_6377ef3d0100gj5m.html



上網時每次都要輸入sudodrcomd:   drcomclogin. 每次都要這樣,有點不爽,所以想着可不可以把命令寫在腳本里,讓UBUNTU啓動的時候自己運行。

本來已經搞定了,過了一段時間,一同學也提出了同樣的問題,結果我忘記了怎麼做的,好不容易回憶起來了,趕緊記下來:

——————————————————————————————————————————————

先來了解一下UBUNTU的啓動管理:(來自:http://www.zhiweinet.com/linux/

大致地說明一下目前ubuntu中與init相關的幾個目錄和應用程序,可以方便後面的論述。這些目錄和程序包括:

init
telinit
runlevel
/etc/event.d/
/etc/init.d/
/etc/rcX.d/

前三個是應用程序(注意哦,它們都不是shell腳本),可以理解爲是由內核調用的。關於它們的功能,從manpage查看就可以了。我們的重點是後面給出的三個目錄。

首先是/etc/event.d/目錄,這是upstart的核心,upstart不同於原有的init的地方就在於它引入了event機制。Event機制通俗的講就是將所有進程的觸發、停止等等都看作event(事件)。/etc/event.d/中就存放了目前upstart需要識別的event。這其中主要有三種rc-default,rcX(x=0,1,…6,S)以及ttyX。這rc-default就類似於那大名鼎鼎的inittab文件,它就是設置默認運行級別的[注:upstart中實際並沒有運行級別的概念,這麼稱呼是爲了init向後的兼容性]。現在你應該知道了ubuntu裏沒有了inittab文件後該到哪裏設置默認運行級別的了吧!catrc-default一下吧!rcX文件是發生相應運行級別事件(可以注意到event這個詞在upstart裏真是無處不見啊)時,需要運行程序的腳本,而ttyX則是設置僞終端數目的,也就是你Ctrl+Alt+F(1~6)調出的那個Console。我們以rc2爲例,catrc2:

start onrunlevel 2
stop on runlevel [!2]
console output
script
set $(runlevel –set 2 || true)
if [ "{GetProperty(Content)}" != "unknown" ]; then
PREVLEVEL={GetProperty(Content)}
RUNLEVEL=$2
export PREVLEVEL RUNLEVEL
fi
exec /etc/init.d/rc 2
end script

..

不去考慮細節,只要注意到前兩行和倒數第二行就可以了。可以看到,rc2文件是定義在發生運行級別2的時候所要執行的東西,核心就是這句:exec/etc/init.d/rc 2。這樣,我們就可以自然地過渡到下一個重要的目錄,/etc/init.d/了。

你可以ls/etc/init.d/看一下里面的內容,對它有個大致的瞭解。/etc/init.d/中存放的是服務(services)或者任務(tasks)的執行腳本。可以這麼說,只要你安裝了一個程序(特別是服務程序daemon),它可以在系統啓動的時候運行,那麼它必定會在/etc/init.d/中有一個腳本文件。我們還回到上面的rc2文件,它執行了一個exec/etc/init.d/rc2的命令。也就是說,給/etc/init.d/rc腳本傳遞了一個參數”2″,讓它執行。我們仔細查看一下rc腳本(很長,耐心點),能看到這樣的一段:

# Nowrun the START scripts for this runlevel.
# Run all scripts with the same level in parallel
…….
for s in /etc/rc$runlevel.d/S*
…….
這說明,當給rc腳本傳遞一個數字參數”X”的時候,它在經過一系列的設置後,將會開始執行/etc/rcX.d/下S開頭的腳本。這就過渡到下一個目錄/etc/rcX.d/了。

進入/etc/rcX.d/,ls -l/etc/rcX.d/看看有些什麼內容?哈哈,沒錯,都是一些到/etc/init.d/中腳本的符號鏈接。不同的是它們的開頭加上了S和一個數字。熟悉原本init的人應該知道,S表示在啓動時運行,數字則表示執行的先後順序。

這樣一來,upstart管理的ubuntu啓動過程應該就清楚了。梳理一下:
1,內核啓動init
2,init找到/etc/event.d/rc-default文件,確定默認的運行級別(X)
3,觸發相應的runlevel事件,開始運行/etc/event.d/rcX
4,rcX運行/etc/init.d/rc,傳入參數X
5,/etc/init.d/rc腳本進行一系列設置,最後運行相應的/etc/rcX.d/中的腳本
6,/etc/rcX.d/中的腳本按事先設定的優先級依次啓動,直至最後給出登錄畫面(啓動X服務器和GDM)

理解了這些,手動配置開機服務的啓動與否就很簡單了。Ubutnu默認的啓動級別是2,不想啓動的程序,只要把相應的符號鏈接從/etc/rc2.d/中刪去即可

———————————————————————————————————————————————

這些個原理最好在自己機子上看看,分析分析就明白了。下面說說我是怎麼做的:

在/etc/event.d/中寫一個文件,其名爲net_login,內容爲:
start on runlevel 2
stop on runlevel [!2]
console output
script
exec /etc/init.d/net_login.sh
end script

然後在/etc/init.d/裏寫一個文件,名爲net_login.sh,內容爲:
drcomd
drcomc login

登錄是樣。
登出的話,差不多。 其實也不用管登出!



/////////////////////


*添加程序腳本到/etc/init.d目錄下
{{{
      sudo  cp /home/cnscn/my_servd  /etc/init.d/
}}}
  
*添加到啓動列表
{{{
      sudo   update-rc.d  my_servd  defaults
}}}

*就會產生以下連接:
{{{
       Adding system startup for /etc/init.d/my_servd ...
       /etc/rc0.d/K20my_servd -> ../init.d/my_servd
       /etc/rc1.d/K20my_servd -> ../init.d/my_servd
       /etc/rc6.d/K20my_servd -> ../init.d/my_servd
       /etc/rc2.d/S20my_servd -> ../init.d/my_servd
       /etc/rc3.d/S20my_servd -> ../init.d/my_servd
       /etc/rc4.d/S20my_servd -> ../init.d/my_servd
       /etc/rc5.d/S20my_servd -> ../init.d/my_servd
}}}
在這種情況下,0 1 6指定爲默認關閉服務,2 3 4 5默認爲啓動服務,服務默認運行順序爲20,當然也可以用下面的方法指定各個級別上關閉或啓動

*指定啓動、關閉級別 (20表示一個運行順序,越小越早啓動) (注意後面的''@@color(red):.@@ '' )
{{{
            sudo update-rc.d  my_servd  start  20  3  4  5  .      在3,4,5級別上啓動
            sudo update-rc.d  my_servd  stop  20  0 1 2 6 .     在0,1,2,6級別上關閉
}}}
      
      或
{{{
            sudo update-rc.d my_servd  start 20 3 4 5 .  stop 20 0 1 2 6 .
}}}

*移除服務
{{{
      sudo update-rc.d  -f  my_servd  remove
}}}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章