我們在linux系統中往往需要將自己的程式或指令碼開機自啟動,linux也提供了多種方法,這裡簡單介紹下3種常用的方法,詳細說明下linux下的service。
linux作業系統在啟動時,會呼叫init程序,獲取runlevel資訊,執行對於runlevel下的指令碼,啟動各個服務;接著會執行/etc/rc.d/rc.local檔案。
所以,如果我們有任何想要開機啟動時需要進行的工作,都可以把它寫入rc.local檔案。
注意:並不是所linux系統都有此檔案,自ubuntu16.10後,此檔案就不存在了。
這裡先簡單介紹下流程:
編寫乙個自定義的指令碼,新增執行許可權:例如chmod +x test
將檔案放入/etc/init.d目錄中,然後將指令碼鏈結到開機執行序列中。
例如runlevel3啟動時,希望啟動test.sh,則:ln –s /etc/init.d/test /etc/rc3.d/s95test
另外,我們也可以通過update-rc.d來輔助:
update-rc.d test defaults 95
需要注意的是我們指令碼可能需要在開頭新增一些固定的文字:可以參看如何寫乙個init.d的啟動指令碼。
刪除時,使用:update-rc.d –f test remove
這樣,在rc*.d下就會出現s95test軟鏈結了。
此類鏈結檔案一般以k或s開頭,其中k表示停止(kill)乙個服務,會向指令碼傳遞stop引數;s表示啟動(start)乙個服務,會向指令碼傳遞start引數;所以他們可以指向同乙個指令碼檔案,只是傳遞不同的引數,以產生不同執行結果。
s\k後面會跟數字,表示指令碼的執行順序,數字越小執行順序越靠前。
ps:我在某些系統上測試時,發現「update-rc.d test defaults 95」設定啟動順序95可能會失敗,啟動順序變成了1,即:s01test,這是需要注意的。
自ubuntu16後,已不再使用initd管理系統,很多啟動指令碼以service的方式存在,所以service還是需要好好了解一番的。
一般service都存放於/lib/system/system目錄下,以***.service命名,且內部採用統一的格式:
[unit]
description=***************x #描述服務
after=network.target #用於指定服務啟動的前置條件
documentation= #幫助檔案的位址,可預設
[service]
#type= 啟動時程序行為,比如設為:******
#environmentfile= 指定環境變數,不指定可以設為no
#user= 啟動使用者
#group= 啟動使用者組
execstart= /usr/bin/test #服務啟動命令,此項必填
execstop= /usr/bin/test #服務終止命令,可預設
#restart= 指定重啟條件,比如設為:on-failure
#restartsec= 自動重啟當前服務的間隔秒數,比如設為:1s
[install] #用來定義如何啟動,以及是否開機啟動。
wantedby=multi-user.target #當服務開機啟動後,會放入什麼資料夾,影響啟動順序
以上是乙個簡單的服務檔案,大致可以看出分為3各部分,下面對每個部分做進一步的解釋:
【unit】區塊:
description:簡短描述
requires:當前 unit 依賴的其他 unit,如果它們沒有執行,當前 unit 會啟動失敗
wants:與當前 unit 配合的其他 unit,如果它們沒有執行,當前 unit 不會啟動失敗
bindsto:與requires類似,它指定的 unit 如果退出,會導致當前 unit 停止執行
before:如果該欄位指定的 unit 也要啟動,那麼必須在當前 unit 之後啟動
after:如果該欄位指定的 unit 也要啟動,那麼必須在當前 unit 之前啟動
conflicts:這裡指定的 unit 不能與當前 unit 同時執行
單位檔案可能還包含許多condition…=和 assert…=設定。在啟動裝置之前,systemd將驗證指定條件是否正確。如果不是,則將跳過該單元的啟動(幾乎無提示):
condition...:當前 unit 執行必須滿足的條件,否則不會執行
assert...:當前 unit 執行必須滿足的條件,否則會報啟動失敗
關於condition的具體設定可以看文章後面給出的官方連線,裡面有更加詳細的說明。
【service】區塊
type:定義啟動時的程序行為。它有以下幾種值:
type=******:預設值,執行execstart指定的命令,啟動主程序
type=forking:以 fork 方式從父程序建立子程序,建立後父程序會立即退出
type=oneshot:一次性程序,systemd 會等當前服務退出,再繼續往下執行
type=dbus:當前服務通過d-bus啟動
type=notify:當前服務啟動完畢,會通知systemd,再繼續往下執行
type=idle:若有其他任務執行完畢,當前服務才會執行
execstart:啟動當前服務的命令
execstartpre:啟動當前服務之前執行的命令
execstartpost:啟動當前服務之後執行的命令
execreload:重啟當前服務時執行的命令
execstop:停止當前服務時執行的命令
execstoppost:停止當其服務之後執行的命令
restartsec:自動重啟當前服務間隔的秒數
restart:定義何種情況 systemd 會自動重啟當前服務,可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
timeoutsec:定義 systemd 停止當前服務之前等待的秒數
【install】區塊
alias:當前 unit 可用於啟動的別名
wantedby/requiredby:可以多次使用此選項,也可以使用空格分隔的單位名稱列表;
wantedby:它的值是乙個或多個 target,當前unit啟用時(enable)符號鏈結會放入/etc/systemd/system目錄下面,以target名+.wants字尾構成的子目錄中。
also:當前unit啟用(enable)時,會被同時啟用的其他 unit
defaultinstance:在模板單元檔案中,這指定了如果在沒有任何顯式設定例項的情況下啟用了模板,則應為哪個例項啟用該單元。此選項在非模板單元檔案中無效。指定的字串必須可用作例項識別符號。
官方給出的更多解釋:
當我們寫好乙個,比如test.service的服務檔案後,將其放入/lib/systemd/system目錄下,並執行以下命令:
systemctl reload-daemon
systemctl enable test.service
systemctl start test.service
linux 開機啟動指令碼
開機啟動有兩種方式 通過vnc啟動方式進行說明 一 第一種是通過rc.local檔案,直接將要執行的指令碼名稱寫進去,但是此方法無法保證指令碼執行時網絡卡裝置是否已經徹底啟動。通過自帶軟體中心安裝x11vnc,使用下列命令設定密碼。sudo x11vnc storepasswd 新建.sh 指令碼檔...
linux開機啟動指令碼
來一種linux簡單使用的開機啟動指令碼 1.cd etc rc.d init.d 來到這個目錄下 2.vi aa.sh建立乙個指令碼檔案 比如我的指令碼檔案是 aa.sh bin sh chkconfig 2345 80 90 description 開機自動啟動的指令碼程式 編寫你要啟動的程式的...
Linux開機啟動指令碼
2017 03 18 今天是在學習openstack的虛擬機器啟動機制的時候,發現了一直不對的地方。etc rc.d rc.local很早前折騰tor的時候設定過一次,不過那次不知道為什麼就不好使。為了開機啟動一些指令,需要一下幾個步驟 1 chmod x rc.local原來的時候就應該是沒有設定...