首先先看下linux系統開機啟動順序,如下圖

對,要解決Linux CentOS 和 Red Hat Linux 系統中設置服務自啟動有兩種方式,就是從圖中圈出的兩個步驟下手。
一、修改 /etc/rc.local 文件,添加啟動服務的命令
先寫好啟動腳本或者啟動命令,事先保證啟動腳本或命令能正常啟動服務,然后將腳本路徑或啟動命令添加至/etc/rc.local文件中,這個方法適合比較簡單的shell腳本,比較方便,具體看最后的本次解決方案。
二、把可執行程序注冊為系統服務,並設定級別的自啟動
1、 注冊系統服務
我想使用"service xxxx start"這樣的簡短命令來管理,就必須注冊成為系統服務,那就是在目錄 /etc/init.d/ 下,新建一個以服務名為文件名的文件。
如果我們打開目錄 /etc/init.d/,看到的文件其實都是服務程序文件,每個文件的內容都大同小異,我們會看到,這里的文件在文件結構上幾乎是一樣的。幾乎每個文件都有 start、stop、restart和status這樣的標志,對,我們新建的這個文件也必須具有相同的結構,即可以接受start和stop參數並完成相應的操作。可以這么理解:
service httpd 等價 /etc/rc.d/init.d/httpd
service httpd start 等價 /etc/rc.d/init.d/httpd start
service httpd stop 等價 /etc/rc.d/init.d/httpd stop
所以/etc/init.d/下的這個腳本一般都會有start、stop等方法。這里可以參考mysql公司提供的寫好的mysqld,所以我們裝mysql的時候一般都會cp mysql.server /etc/init.d/mysql。
2、 設定級別的自啟動(這里又有兩種方式:ln -s軟連接和chkconfig)
- ln -s軟連接:
在 Linux 中有 7 種運行級別(可在 /etc/inittab 文件設置),每種運行級別分別對應着 /etc/rc[0~6].d 這 7個目錄。這 7個目錄中,每個目錄分別存放着對應運行級別加載時需要關閉或啟動的服務,如下圖 rc3.d 目錄所示,其實每個腳本文件都對應着 /etc/init.d/ 目錄下具體的服務,K 開頭的腳本文件代表運行級別加載時需要關閉的,S 開頭的代表需要執行啟動的。

格式:ln -s 目標文件名 連接文件名
例子:cd /etc/rc3.d/
ln -s ../init.d/hdz_service ./S99hdz_service
連接文件名采用“SXX目標文件名”的格式,其中XX一般是一個從1到100的整數,它表示啟動優先級,數字越大,優先級越低,比如:服務A的運行要依賴服務B,那A的XX數字就應該大於B的。后跟“目標文件名”是為了一目了然,一看就知道是哪個文件的符號連接。
目錄 /etc/rc3.d/ 是系統啟動時自動搜索的目錄,該目錄下的符號連接文件的目標文件,都將被運行,這就是在這個目錄建立符號連接的原因——為了開機就運行。
- Chkconfig命令添加管理服務:
Ps: 服務管理,centos是chkconfig,ubuntu是update-rc.d
1.查看是否已經注冊為服務,查看命令:chkconfig --list mysqld(以 mysqld 為例)

通過命令沒有查看到,說明還沒有添加到啟動服務,通過命令 chkconfig --add mysqld 添加即可。
2.給服務可執行的權限:
# chmod 755 mysqld
3.如果需要自啟動某些服務,只需使用命令chkconfig <服務名> on 即可,若想關閉,將 on 改為 off。
# chkconfig mysqld on
在默認情況下,chkconfig 會自啟動 2345 這四個級別,如果想自定義啟動級別可以加上 --leve l選項,后邊跟指定的啟動級別。
示例:先將 mysqld 服務的所有啟動級別關閉,然后使用 --level選項啟動自定義級別。
chkconfig --level 2345 mysqld off #關閉2345級別啟動。

chkconfig --level 35 mysqld on #指定3、5級別啟動。

其中2345是默認啟動級別,級別有0-6共7個級別。
等級0表示:表示關機
等級1表示:單用戶模式
等級2表示:無網絡連接的多用戶命令行模式
等級3表示:有網絡連接的多用戶命令行模式
等級4表示:不可用
等級5表示:帶圖形界面的多用戶模式
等級6表示:重新啟動
10是啟動優先級,90是停止優先級,優先級范圍是0-100,數字越大,優先級越低。
ps:這里另外提一句,關於systemctl 命令,是centos7才有的,6和6之前的版本都沒有,systemctl 是系統服務管理器命令,它將 service 和 chkconfig 這兩個命令組合到一起,也可以設置開機啟動,關於systemctl和chkconfig的區別請參考http://blog.csdn.net/kenhins/article/details/74518978
----------------------------------------------小技巧---------------------------------------------
已上的步驟比較麻煩,能否把這幾個步驟自動化一下?這樣在一台新機子上部署就方便了。還記得我們那個記錄代碼文件之間依賴關系的makefile文件嗎?我們在這里要用到它了。
在makefile文件中添加一個標志,並在該標志下添加和下面類似的代碼:
install: cp ./hdz_pro /usr/sbin/ cp ./hdz_service /etc/init.d/ cd /etc/init.d/ chmod +x hdz_service cd /etc/rc3.d/ ln -sf ../init.d/hdz_service ./S99hdz_service
在標志install下的沒一句話,前面一定要留空白,這不僅是有利於閱讀,更是一個要求,makefile文件要求每一句可執行語句前都要有空白(空格或tab)。
上面代碼中的 hdz_pro 和 hdz_service 分別是可執行文件名和服務名,這兩個名稱換成你自己的就行了,操作時用以下命令: make install
運行完就一切OK了。
----------------------------------------------------------------------------------------------------------
本次關於解決阿里雲開機啟動apicy中間件12301.jar的解決方案(采用第一種方式)
1.新建一個腳本,如/home/server/middleware.sh,內容如下
#/bin/bash export JAVA_HOME=/home/dev/jdk/jdk1.8.0_20 export PATH=$PATH:$JAVA_HOME/bin nohup java -jar /home/server/12301.jar --spring.profiles.active=pressure >> /home/server/nohup.out 2>&1 &
Ps:這里有兩個注意點
- 有一個nohup: failed to run command ‘java’: No such file or directory的錯誤就是因為沒有導入java的環境變量,所以前兩行一定需要。

- 腳本中一定要用絕對路徑,之前寫的>> ./nohup.out,就是一個坑,因為開機啟動的時候根本沒有當前路徑。
2.執行如下命令,將該腳本標記為可執行文件(添加可執行的權限)
chmod +x /home/server/middleware.sh
3.修改 /etc/rc.local 文件,添加啟動服務的命令
#vi /etc/rc.local

4.這樣, middleware.sh這個腳本在開機的時候就會被執行了,以后再這里面寫啟動服務的命令就可以了
linux使用某非root用戶執行開機啟動項(由於服務器由唱游提供,沒有root用戶)
- 創建shell腳本,/home/devuser/server/middleware.sh

2. 用root用戶登錄,修改/etc/rc.local,在最后一行添加
su - devuser -c "/home/devuser/server/middleware.sh"
這個地方一定要注意 su - 這個是環境的變量也會做相應的轉換;如果環境變量沒有改變的話,我們用su 就可以了。
總結下,修改 /etc/rc.local 文件的方法一般適用於簡單的shell腳本,注冊為系統服務(/etc/init.d/)的方法適用於官方就有腳本提供(如mysqld,httpd),或實在有自寫服務腳本的需要。
