日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

centos 最简单的服务程序

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 centos 最简单的服务程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Linux平臺下的service程序編寫指南

Hu Dennis Sep 24, 2010轉載注明出處http://blog.csdn.net/gobitan

?

摘要:本文主要介紹了如何編寫一個service服務所涉及的兩個主要方面。1)將一個普通程序裝成daemon程序;2)編寫service方式的shell腳本。并以C語言為例,基于Red hat 企業版5.3平臺演示了一個service服務程序從代碼編寫到腳本調試以及測試運行全過程。

?

(一)? Service介紹

Service是一種被稱為守護進程(daemon)的程序。它通常一旦啟動后就在后臺持續運行,通常在等待什么輸入或者監控系統有什么變化。例如Apache服務器有一個叫httpd的守護進程監聽80端口以等待http請求。

Service程序通常通過service命令來啟動或停止等。例如apache服務的啟動可通過”service httpd start”來啟動。

通過” chkconfig --list”可以查看系統當前所有的service服務。

通過” service --status-all”可以查看系統當前所有service服務的狀態。

?

要自己編寫一個類似httpd的service方式的服務應該包括兩個部分:(1)將普通程序包裝成daemon程序;(2)編寫service控制腳本來管理daemon程序。

因此,每個service服務在/etc/rc.d/目錄下都對應一個可執行的腳本。如apache的httpd對應/etc/init.d/httpd。

?

參考資料:http://bobpeers.com/linux/services.php

?

(二)如何將普通程序包裝成daemon程序

??? 這里僅介紹一種較為簡單的方式,關于其原理及更詳細的介紹請參見本節參考資料。

??? linux提供了一個名叫daemon的函數來初始化環境,如下:

????????????? int daemon(int nochdir, int noclose);

??? 使用該函數需加入#include <stdlib.h>頭文件包含。調用該函數之后,其后的程序將會以daemon方式運行。

??? 下面以Hello world為例,因為daemon程序是一個持續運行程序,為了測試運行本文以while+sleep來模擬。

#include <stdio.h> #include <stdlib.h>int main() {daemon(0,0);while(1){printf("Hellow World!/n");sleep(100000);} }

保存上面的測試程序為dennis.c,執行如下編譯命令得到dennisd守護進程程序。

#gcc -c dennis.c

# gcc -o dennisd dennis.o

?

??? 實際運行中,例如你編寫了一個tcp服務器程序,可以程序寫成一個函數(如tcp_server),然后將while部分更換為你的函數tcp_server()即可。如下:

#include <stdio.h> #include <stdlib.h>int main() {daemon(0,0);tcp_server(); }
參考資料: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html

?

(三)如何編寫service控制腳本

??? 首先腳本必須放在/etc/init.d/目錄下,因此本文在先創建/etc/init.d/dennisd腳本文件。內容如下:

#!/bin/bash # # Description: This shell script takes care of starting and stopping dennis # Hu Dennis created on Sep. 24th, 2010 # # Source function library . /etc/init.d/functions#the service name for example: dennis SNAME=dennisd#the full path and name of the daemon program #Warning: The name of executable file must be identical with service name PROG=/usr/bin/$SNAME# start function start() {#check the daemon status firstif [ -f /var/lock/subsys/$SNAME ]thenecho "$SNAME is already started!"exit 0;elseaction "Starting $SNAME ..." $PROG[ $? -eq 0 ] && touch /var/lock/subsys/$SNAMEexit 0;fi }#stop function stop() {echo "Stopping $SNAME ..."killproc $SNAMErm -rf /var/lock/subsys/$SNAME }case "$1" in start)start;; stop)stop;; reload|restart)stopstart;; status)status $SNAME;; *)echo $"Usage: $0 {start|stop|restart|status}"exit 1 esac
腳本較為簡單,再次不做過多解釋。然后執行如下命令給dennisd增加可執行權限:

#chmod +x dennisd

?

(四)常見調試錯誤

??? 在調試該腳本的時候常見的集中錯誤如下:

(1)dennisd: unrecognized service:先檢查/etc/rc.d/init.d/dennisd是否存在,然后再看該文件是否有可執行權限。

(2)env: /etc/init.d/dennisd: No such file or directory:這種情況一般是windows與linux的格式兼容問題,執行dos2unix將dos格式轉換程序linux格式(ubuntu下為fromdos命令)。

(3)Usage: status [-p pidfile] {program}: status后面的參數不對

(4)dennisd dead but subsys locked:可執行程序的名字需要與service名字保持一致。

?

(五)測試運行

??? 將第二步編譯得到的dennisd程序拷貝至/usr/bin/目錄下,然后執行如下命令測試:

(1)啟動服務

???? [root init.d]# service dennisd start

Starting dennisd ... [? OK? ]

? 通過ps命名確認dennisd已經啟動:

???????? [root init.d]# ps -ef|grep dennisd

root????? 3885???? 1? 0 14:30 ???????? 00:00:00 /usr/bin/dennisd

?

(2)查看狀態

[root init.d]# service dennisd status

dennisd (pid 3885) is running...

?

(3)停止服務

[root init.d]# service dennisd stop

Stopping dennisd ...

再執行status命令查看狀態

[root init.d]# service dennisd status

dennisd is stopped

?? (4)多次啟動

??????? [root init.d]# service dennisd start

Starting dennisd ... [? OK? ]

[root init.d]# service dennisd start

dennisd is already started!

如果服務已經啟動,系統會提示而不會啟動多個。

?

(六)結束語

??? 本文以C語言為例,在linux環境下演示了一個service服務程序從代碼編寫到腳本調試以及測試運行全過程,希望對有此需求的朋友有所幫助!

總結

以上是生活随笔為你收集整理的centos 最简单的服务程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。