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
顯然僅僅添加了一句程式碼:
/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種方法,如有錯誤,歡迎指正。