在舊時(shí)代是使用update-rc.d命令來(lái)操作的,具體步驟可以查閱網(wǎng)上其他資料,在這里介紹使用systemctl命令來(lái)更加優(yōu)雅地實(shí)現(xiàn)。
0x01 編寫腳本
腳本存放在/etc/init.d位置下,文件名如 hello,記得加上可執(zhí)行權(quán)限。
sudo vi /etc/init.d/hello
sudo chmod +x /etc/init.d/hello
腳本將由root用戶自動(dòng)執(zhí)行,編寫時(shí)涉及到文件等一些權(quán)限操作時(shí)注意一下就好。
對(duì)于腳本的內(nèi)容。。。emmm..確實(shí)是有點(diǎn)格式要求的,一開始我直接就擼了一句
echo "hello" >> /home/ubuntu/log
然而并無(wú)卵用,正確的姿勢(shì)應(yīng)該是這樣的,最簡(jiǎn)單的腳本如下:
#!/bin/sh
### BEGIN INIT INFO
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO
echo "hello world" >> /home/ubuntu/log
開頭的那幾行注釋,一句都必不可少,shell可以換成#!/bin/bash,也可以是其他的都行。但必須有指定腳本所使用的shell。注釋完后就是自己寫的腳本內(nèi)容了,我這里只是隨便hello了一下。
Default-Start、 Default-Stop 是指腳本在哪個(gè)runlevel被執(zhí)行,以上的2345是最常見的運(yùn)行等級(jí),一般腳本都這樣寫就行了。
詳情點(diǎn)我看Linux標(biāo)準(zhǔn)
0x02 設(shè)置腳本開機(jī)自啟動(dòng)
這里就可以優(yōu)雅地使用systemctl命令了,一句話搞定:
sudo systemctl enable hello
如果腳本里那幾行注釋沒(méi)有缺少的話,是不會(huì)有任何報(bào)錯(cuò)的。
如果出現(xiàn)
update-rc.d: error: XXX Default-Start contains no runlevels, aborting.
意味著,腳本里缺少了運(yùn)行級(jí)別的說(shuō)明,并不知道什么時(shí)候啟動(dòng)。
如果沒(méi)有指定shell,腳本可能無(wú)法成功執(zhí)行。
0x03 Good Luck
sudo reboot
重啟幾次看看腳本執(zhí)行成功了沒(méi)有吧~~~每一次重啟,那個(gè)log文件都會(huì)多一句hello world。
0x04 取消腳本開機(jī)自啟動(dòng)
sudo systemctl disable hello
0x05 調(diào)整啟動(dòng)順序
有些程序需要先有網(wǎng)絡(luò)才能順利啟動(dòng),可以采用官方的例子,調(diào)整啟動(dòng)順序:
# Required-Start: $local_fs $network $remote_fs
就是在有網(wǎng)、本地文件系統(tǒng)、遠(yuǎn)程文件系統(tǒng)都就緒情況下再啟動(dòng)本服務(wù)。
### BEGIN INIT INFO
# Provides: lsb-ourdb
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop OurDB
# Description: OurDB is a very fast and reliable database
# engine used for illustrating init scripts
### END INIT INFO
Linux就是這么簡(jiǎn)單優(yōu)雅~???