1. 程式人生 > >Linux下程式開機自啟動

Linux下程式開機自啟動

在windows下使一個應用程式開機自啟動,只需要把它加入開機啟動項即可,那麼在Linux下如何設定呢?

下面介紹兩種方法可以使Linux下的應用程式開機自啟動。


第一種方法:在啟動指令碼/etc/rc.local新增啟動命令。

下面編譯生成一個小程式:StartMain

/*************************************************************************
	> File Name: StartMain.c
	> Author: KentZhang
	> Mail: [email protected]
> Created Time: 2015年12月12日 星期六 20時57分42秒 ************************************************************************/ #include<stdio.h> int main(){ printf("StartMain start!\n"); while(1); return 0; }

上面例項程式碼,僅僅3行非常簡單,注意這個程式不會退出。

編譯:gcc   StartMain.c   -o   StartMain

可執行檔案StarfMain的絕對路徑是 /home/kent/StartMain

然後將執行命令新增到rc.local檔案中,注意修改這個檔案要有root許可權,修改如下:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/home/kent/StartMain>/dev/null 2>&1 &

exit 0


就這樣,如此簡單,下次系統重啟,就會自啟動這個小程式StartMain。
顯然僅僅添加了一句程式碼:
/home/kent/StartMain>/dev/null 2>&1 &

系統啟動後會執行它,這個程式就會啟動。

/home/kent/StartMain  表示執行這個可執行程式。

>/dev/null  表示將程式的標準輸出重定向到/dev/null,/dev/null是一個空裝置,將丟棄一切寫入的資料。

2>&1  表示將標準出錯重定向到標準輸出,2和1,其實都是檔案描述符,但是1前面有&,如果不加&,會認為1是一              個檔名。

&   表示這個程式在後臺執行,這個&符號,一定要有!!!!本例中的程式不會退出,不在後臺執行,那麼這句shell     命令會一直等待返回,但是程式不會結束,所以不會返回,那麼系統將會卡死在這裡,不能正常啟動,這一點要切      記!!!


第二種方法:將程式註冊成服務。

在這裡首先介紹一下Linux系統執行級別的概念,在windows系統啟動時,可以以安全模式啟動,顯然與正常啟動的不同,可以類似看做不同的執行級別。而Linux系統有7種不同的執行級別,即0~6,7個執行級別,可以用命令runlevel檢視當前系統的執行級別。

但是不同的Linux的系統執行級別定義不一樣,這裡主要是Debian和Redhat系列的不同,Ubuntu是基於的Debian,CentOS是基於Redhat。

debian的runlevel級別定義如下:
0:Halt,關機模式
1:Single,單使用者模式
2:Full multi-user with display manager (GUI)
3:Full multi-user with display manager (GUI)
4:Full multi-user with display manager (GUI)
5:Full multi-user with display manager (GUI)
6:Reboot,重啟
Ubuntu的預設開機的runlevel是2,但是可以發現runlevel 2~5都是一樣的,即多使用者圖形模式執行,這一點和Redhat系列是有區別的。


redhat的runlevel級別定義如下: 
0:系統停機狀態,系統預設執行級別不能設定為0,否則不能正常啟動,機器關閉。
1:單使用者工作狀態,root許可權,用於系統維護,禁止遠端登陸,就像Windows下的安全模式登入。
2:多使用者狀態,沒有NFS支援。
3:完整的多使用者模式,有NFS,登陸後進入控制檯命令列模式。
4:系統未使用,保留一般不用,在一些特殊情況下可以用它來做一些事情。例如在膝上型電腦的電池用盡時,可以         切換到這個模式來做一些設定。
5:X11控制檯,登陸後進入圖形GUI模式,XWindow系統。
6:系統正常關閉並重啟,預設執行級別不能設為6,否則不能正常啟動。執行init6機器就會重啟。

Redhat系列的runlevel 2~5劃分的更為詳細,我想強調的是Redhat系列的啟動級別一般都是 runlevel 3 或者runlevel 5,分別表示命令列模式啟動執行和圖形介面模式啟動執行。

下面正式介紹如何將一個程式註冊服務並使之開機啟動,本例是以Ubuntu 12.04為測試機:

第一步:編寫服務指令碼。

程式碼如下,是一個shell指令碼StartMain,該指令碼的檔名要與程式名保持一致。

#########################################################################
# File Name: StartMain
# Author: KentZhang
# mail: [email protected]
# Created Time: 2015年12月13日 星期日 08時32分11秒
#########################################################################
#!/bin/bash

ProgramPath=/home/kent/StartMain
ARG=$1


FunStart(){                         #啟動程式的函式

if [ -e $ProgramPath ];then         #判斷可執行檔案是否存在
	pid=$(pidof ${ProgramPath}) #判斷這個程式是否已經啟動
	expr $pid + 0 >/dev/null
	if [ $? -eq 0 ] && [ $pid -gt 0 ];then 
			echo "StartMain process already exists."
			exit 0		
	fi
	nohup $ProgramPath > /dev/null 2>&1 &  #啟動程式
else
	echo $CollectorManger is not exists.
fi

}


FunStop(){                          #停止程式的函式
pid=$(pidof ${ProgramPath})         #獲取這個程式的PID
expr $pid + 0 >/dev/null           #判斷獲得的PID是否是整數,是否大於0
if [ $? -eq 0 ] && [ $pid -gt 0 ];then
	kill -9 $pid >/dev/null         #殺死該程式
fi

}


#根據傳進指令碼的引數分別執行對應的分支
case $ARG in
start):                            #啟動
FunStart

;;

stop):                             #停止
FunStop

;;

restart):                          #重啟
FunStop
FunStart

esac

第二步:註冊服務

將上面編寫的指令碼複製到/etc/init.d目錄下,注意需要root許可權。

此時,程式StartMain程式已經註冊成服務,在任意工作目錄下,執行shell: 

service StartMain start

servive StartMain stop

service StartMain restart

可以分別完成StartMain程式的啟動、停止、重啟。注意,許可權不夠,要加sudo。

第三步:將服務加入啟動項

這一步,就是建立幾個軟連結,分別執行:

sudo ln -s  /etc/init.d/StartMain  /etc/rc0.d/K100StartMain

sudo ln -s  /etc/init.d/StartMain   /etc/rc2.d/S100StartMain   

sudo ln -s  /etc/init.d/StartMain   /etc/rc3.d/S100StartMain

sudo ln -s  /etc/init.d/StartMain  /etc/rc5.d/S100StartMain

這樣就完成了啟動項的新增,程式開機會啟動程式,關機會停止程式。

對於Ubuntu只需要做前面2個連結即可,後面2個連結是為了相容Redhat系列。

系統執行在0,2,3,5級別就回去執行對應目錄下的指令碼即/etc/rc0.d,/etc/rc2.d/,/ect/rc3.d,/etc/rc5.d目錄下指令碼。

軟連結的命名很有意思,都是 K或者S+數字+服務指令碼名,K表示kill,即stop,表示執行/etc/init.d/StartMain時,傳入引數stop,S表示start,表示傳入引數start,中間的數字表示執行順序,因為在rcn.d目錄下,有許多這樣的連結,因此中間的數字決定了指令碼的執行順序,數字越小越先執行,有時候程式之間有依賴性,這個順序也是非常重要。


以上就是設定Linux程式開機自啟動的2種方法,如有錯誤,歡迎指正。