2012年8月11日 星期六

[Linux 小學堂] 設定自己的系統服務並於開機後啟動


前言 :
在 Windows, 你可以透過在 開始 > 所有程式 > 啟動 下添加程式. 如此你的程式將會由 OS 自動在開機後執行該程式 :


如果是 Linux 呢? 同樣的你可以根據不同的 run level, 將你打算在系統開機後執行的 script 放在 /etc/rc[0-6].d/ 下面, 則系統會在開機後自動到這裡執行你的 script. 底下是各個 run level 的定義 :


實驗範例 :
這邊假設我的機器 run level=2, 而我有一個程式希望在系統開機後自動執行. 因此我寫了一個簡單 script "S98spserv" 放在 /etc/rc2.d/ 下. 其中檔名 S 指的是開機後執行的順序, 後面跟著 98 說明在第 98 順位下被執行, 接著跟著 "spserv" 即是我服務的名稱. script 內容如下 :
  1. #!/bin/sh -e  
  2. touch /home/john/Test/S98spservTest_rc2                 # Test to check if being executed  
  3. echo "$1" > /home/john/Test/S98spservTest_rc2           # echo first argument into the touch file  
  4. DFT_PATH=`pwd`  
  5. echo "$DFT_PATH" >> /home/john/Test/S98spservTest_rc2   # Check execution path  
  6. cd /home/john/NTNUProj/                                 # Change to working directory  
  7. CUR_PATH=`pwd`                                          # Check current path  
  8. echo "$CUR_PATH" >> /home/john/Test/S98spservTest_rc2   # echo path info into touch file  
  9. java -Xmx1024M -cp NLPracTasks.jar stanford.services.Webserv -c webserv.properties & # Start my service  
上面程式碼會在 /home/john/Test 下建立檔案 "S98spservTest_rc2" 並將一些相關訊息寫到裡面, 最後一行即是啟動我自己的服務. 接著我們可以使用下面命令讓系統重啟 :
$ sudo init 6

接著來檢查看看系統有沒有執行剛剛我們建立的 script :
$ cd /home/john/Test/ # 我們的 script 會在這裡建立測試檔案
$ cat S98spservTest_rc2 # 檢查檔案內容.
start
/
/home/john/NTNUProj

由上可以知道開機後, 系統會以 "start" 為參數來執行我們的 script, 且執行的位置為跟目錄 '/'. 接著來檢查我的 service 有沒有成功開啟 :
$ ps -aux | grep java
root 1769 100 18.1 1417728 373664 ? Sl 18:56 3:25 java -Xmx1024M -cp NLPracTasks.jar stanford.services.Webserv -c webserv.properties

打完收工, 我們的服務已經成功啟動.

補充說明 :
Linux系統的啟動程序
鳥哥 Linux 私房菜 : 第十八章、認識系統服務 (daemons)
系統為了某些功能必須要提供一些服務 (不論是系統本身還是網路方面),這個服務就稱為 service 。 但是 service 的提供總是需要程式的運作吧!否則如何執行呢?所以達成這個 service 的程式我們就稱呼他為 daemon 囉! 舉例來說,達成循環型例行性工作排程服務 (service) 的程式為 crond 這個 daemon...

鳥哥 Linux 私房菜 : 第二十章、開機流程、模組管理與 Loader
主機系統開始運作後,此時 Linux 才會呼叫外部程式開始準備軟體執行的環境, 並且實際的載入所有系統運作所需要的軟體程式哩!最後系統就會開始等待你的登入與操作啦! 簡單來說,系統開機的經過可以彙整成底下的流程的 :
1. 載入 BIOS 的硬體資訊與進行自我測試,並依據設定取得第一個可開機的裝置
2. 讀取並執行第一個開機裝置內 MBR 的 boot Loader (亦即是 grub, spfdisk 等程式);
3. 依據 boot loader 的設定載入 Kernel ,Kernel 會開始偵測硬體與載入驅動程式;
4. 在硬體驅動成功後,Kernel 會主動呼叫 init 程式,而 init 會取得 run-level 資訊;
5. init 執行 /etc/rc.d/rc.sysinit 檔案來準備軟體執行的作業環境 (如網路、時區等);
6. init 執行 run-level 的各個服務之啟動 (script 方式);
7. init 執行 /etc/rc.d/rc.local 檔案;
8. init 執行終端機模擬程式 mingetty 來啟動 login 程式,最後就等待使用者登入啦;
This message was edited 16 times. Last update was at 11/08/2012 19:04:16

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...