導航:首頁 > 操作系統 > linux創建系統服務

linux創建系統服務

發布時間:2022-07-10 15:03:03

㈠ 如何自定義linux服務並設置服務開機啟動

1. 服務概述
在linux操作系統下,經常需要創建一些服務,這些服務被做成shell腳本,這些服務需要在系統啟動的時候自動啟動,關閉的時候自動關閉。
將需要自動啟動的腳本/etc/rc.d/init.d目錄下,然後用命令chkconfig --add filename將自動注冊開機啟動和關機關閉。實質就是在rc0.d-rc6.d目錄下生成一些文件連接,這些連接連接到/etc/rc.d /init.d目錄下指定文件的shell腳本。

2. 手工創建服務
在/etc/rc.d/init.d目錄下創建shell腳本,文件名auto_run。
設置腳本的運行許可權chmod +x auto_run。
然後在rc0.d-rc6.d目錄下分別創建文件連接。
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc2.d/S99auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc3.d/S99auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc5.d/S99auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc0.d/K01auto_run
ln -s /etc/rc.d/init.d/auto_run /etc/rc.d/rc6.d/K01auto_run

這樣系統在啟動的時候,就會運行auto_run 並加上start參數,等同於執行命令auto_run start。
在系統關閉的時候,就會運行auto_run,並加上stop參數,等同於運行命令auto_run stop。

創建連接的6條命令可以用命令chkconfig --add auto_run來完成,這樣就簡單多了,還不容易出錯。
下面就介紹一下chkconfig命令。
3. chkconfig命令用法
語法:
chkconfig --list [name]
chkconfig --add name
chkconfig --del name
chkconfig [--level levels] name <on|off|reset>
chkconfig [--level levels] name

㈡ 如何實現在Linux下創建服務程序

Linux系統能提供強大可靠的網路服務,並有管理程序對服務進行管理。例如我們熟悉的Web、FTP和電子郵件等,它們既可以單獨運行,也可以被守護進程inetd調用,而且運行得都非常好。但我們不能僅停留在贊嘆中,下面就給出兩個服務程序程序和一個客戶程序的例子,介紹服務程序和客戶程序之間是如何溝通的。另外還要編輯配置一些文件,讓服務程序也能接受服務管理程序管理。

這兩個服務程序功能相同,但一個是獨立服務程序,另一個是被inetd調用的服務程序。這是TCP/IP網路服務的兩大類,這里將兩個程序放在一起是為了比較程序結構和運行方式。兩服務程序都在Red Hat Linux 7.1和TurboLinux 7.0上調試通過。

獨立伺服器

TCP和UDP是兩大TCP/IP數據傳輸方式,套介面是建立伺服器客戶機連接的機制,首先介紹它們建立通信聯系的過程,然後給出一個TCP服務程序例子。

1.TCP套介面通信方式

對於TCP伺服器端,服務程序首先調用建立套介面的函數socket(),然後調用綁定服務IP地址和協議埠號函數bind()。綁定成功後調用被動監聽函數listen()等待客戶連接,還要調用獲取連接請求函數accept(),並一直阻塞到客戶連接請求的到達,這個函數獲取客戶機IP地址和協議埠號。

對於TCP客戶端,客戶程序啟動後後調用建立套介面函數socket(),然後調用連接函數connect(),此函數與伺服器通過三次握手建立連接。

伺服器和客戶機建立連接後,就可以使用讀函數read()和寫函數write()收發數據了。數據交換完成後便各自調用關閉套介面函數close()刪除套介面。TCP套介面通信方式見圖1所示。

圖1 TCP套介面通信方式

2.UDP套介面通信方式

UDP程序與TCP的區別是無需建立連接。伺服器首先啟動,然後等待用戶請求。客戶機啟動後便直接向伺服器請求服務,伺服器接到請求後給出應答。

對於UDP伺服器端,服務程序首先調用套介面函數socket(),然後調用綁定IP地址和協議埠號函數bind()。之後調用函數recvfrom()接收客戶數據,調用sendto()向客戶發送數據。

對於UDP客戶端,客戶機程序啟動後調用套介面函數socket(),然後調用sendto()向伺服器發送數據,調用recvfrom()接收伺服器數據。

雙方數據交換成功後,各自調用關閉套介面函數close()關閉套介面。UDP套介面通信方式見圖2所示。

圖2 UDP套介面通信方式

下面給出獨立服務程序的例子。這個程序雖然簡單,但是與復雜程序有著相同的結構。

//程序名:server.c
//功能:伺服器從客戶機讀入一個字元,並將排在此字元後面的字元回送客戶機
//伺服器埠:9000
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int pid; //用於存放fork()執行結果
int server_sockfd,client_sockfd; //用於伺服器和客戶機套介面描述符
int bind_flag,listen_flag; //用於存放bind()和listen()執行結果
int server_address_length,client_address_length; //作為伺服器客戶機地址長變數
struct sockaddr_in server_address; //作為伺服器地址結構變數(含地址和埠)
struct sockaddr_in client_address; //作為客戶機地址結構變數(含地址和埠)
if((pid=fork())!=0) //用fork()產生新進程
exit(0) ;
setsid() ; //以子進程開始下面的程序

函數socket(),創建一個套介面,成功則返回套介面描述符。

server_sockfd=socket(AF_INET,SOCK_STREAM,0);
if(server_sockfd<0)
{
printf(「socket error /n」);
exit(1);
}
server_address.sin_family=AF_INET;

函數htonl()用於將32位主機位元組順序轉換為網路位元組順序,其中參數INADDR_ANY表示任何IP地址。

server_address.sin_addr.s_addr=htonl(INADDR_ANY);

函數htons()用於將16位主機位元組順序轉換為網路位元組順序,其中的參數是綁定的埠號,讀者可根據環境自行改動,目的是不與其它服務埠沖突。

server_address.sin_port=htons(9000);
server_address_length=sizeof(server_address);

函數bind()用於綁定本地地址和服務埠號,若調用成功返回值為0。

bind_flag=bind(server_sockfd,/
(struct sockaddr *)&server_address,/
server_address_length);
if(bind_flag<0)
{
printf(「bind error /n」);
exit(1);
}

函數listen(),指明伺服器的隊列長度,被動等待客戶連接,調用成功返回值為0。

listen_flag=listen(server_sockfd,5);
if(listen_flag<0)
{
printf(「listen error /n」);
exit(1);
}

while(1)
{
char ch;

函數accept()等待和獲取用戶請求,為每個新連接請求創建一個新的套介面,調用成功返回新套介面描述符。

client_sockfd=accept(server_sockfd,/
(struct sockaddr *)&client_address,/
&client_address_length);

函數read()和write()用於在伺服器和客戶機之間傳送數據,調用成功返回讀和寫的位元組數。

函數close(),用於程序使用完一個套介面後關閉套介面,調用成功返回值0。其中的參數為accept()創建的套介面的描述符client_sockfd。

read(client_sockfd,&ch,1);
printf(「cli_ch=%c」,ch);
ch++;
write(client_sockfd,&ch,1);

close(client_sockfd);
}
}

程序完成後就可以使用命令進行編譯。在命令行中輸入「gcc -o server server.c」,將server.c編譯成可執行程序server,這時便可用客戶程序進行測試。在命令行執行「./server」啟動服務程序,執行「netstat -na」查看有無server的服務埠。如果存在,則執行下面編寫的客戶程序「./client」。不過這僅是手工啟動的方法,下面給出用服務管理程序管理server程序的方法。只要在目錄/etc/rc.d/init.d下放入服務程序的腳本就能被服務程序讀到。在命令行執行「touch server」創建文件server,並將文件屬性改成可執行。在管理程序中並不能看到此服務名,腳本文件必須有一些結構才能被管理程序認為是服務程序腳本。

為了減少工作量,拷貝/etc/rc.d/init.d下腳本httpd,將拷貝腳本名命名為server,然後對其編輯。

(1)執行「cp httpd server」。

(2)用文本編輯器vi(其它編輯器亦可)將server打開進入編輯狀態。首先用字元串server替換httpd。然後找到daemon server行,如果編寫的程序放在變數PATH目錄中,不需要修改此行;如果把服務程序放在其它目錄中,就要寫服務的全路徑。例如程序在/root的目錄中,就要寫成daemon /root/server,還要刪除「rm -f /var/run/server.pid」這一行。

(3)執行「chmod 755 server」,將server屬性設定為可執行。

此時就可以用chkconfig、ntsysv等工具,在希望的運行級中增加這個新服務程序,然後測試客戶機與伺服器能否通信。

被xinetd調用的服務程序

在Linux系統中,有很多服務是被xinetd(較早版本使用的是inetd)超級守護伺服器啟動的。其實凡是基於TCP和UDP的服務都可使用超級守護進程啟動,只是在服務量很大影響效率的情況下不被採用。

1.依賴xinetd啟動的服務建立通信過程

為了與獨立伺服器程序比較,我們看一下依賴xinetd的伺服器是如何啟動的。

(1)xinetd啟動時讀取/etc/xinetd目錄中的文件(早期版本為/etc/inetd文件),根據其中的內容給所有允許啟動的服務創建一個指定類型的套介面,並將套介面放入select()中的描述符集合中。

(2)對每個套介面綁定bind(),所用的埠號和其它參數來自/etc/xinetd目錄下每個服務的配置文件。

(3)如果是TCP套介面就調用函數listen(),等待用戶連接。如果是UDP套介面,就不需調用此函數。

(4)所有套介面建立後,調用函數select()檢查哪些套介面是活動的。

(5)若select()返回TCP套介面,就調用accept()接收這個連接。如果為UDP,就不需調用此函數。

(6)xinetd調用fork()創建子進程,由子進程處理連接請求。

◆ 子進程關閉所有其它描述符,只剩下套介面描述符。這個套介面描述符對於TCP是accept()返回的套介面,對於UDP為最初建立的套介面。然後子進程連續三次p()函數,將套介面描述符復制到0、1和2,它們分別對應標准輸入、標准輸出和標准錯誤輸出,並關閉套介面描述符。

◆ 子進程查看/etc/xinetd下文件中的用戶,如果不是root用戶,就用調用命令setuid和setgid將用戶ID和組ID改成文件中指定的用戶。

(7)對於TCP套介面,與用戶交流結束後父進程需要關閉已連接套介面。父進程重新處於select()狀態,等待下一個可讀的套介面。

最後調用配置文件中指定的外部服務程序,外部程序啟動後就可與用戶進行信息傳遞了。

2.為xinetd編寫專門的服務程序

除了獨立服務程序能被xinetd啟動外,還可以為xinetd編寫專門的程序。此處的例子程序與上面server.c功能相同。不過兩者的程序區別是很大的,此例的代碼僅相當於上面傳輸數據的部分。我們還將程序名定為server.c,所以不能放在相同目錄中,同名僅是為了和上面程序對照。

#include "unistd.h"
int main()
{
char ch;
read(0,&ch,1);
ch++;
write(1,&ch,1);
}

將程序編譯成可執行文件,並做些設置就可被xinetd啟動。注意不要和上面的獨立服務程序server一起啟動,因為客戶程序寫得比較簡單,訪問的是固定埠,伺服器都設成了相同的埠號。

(1)編輯/etc/services文件,在行末增加一條記錄:

server 9000/tcp

(2)在目錄/etc/xinetd.d下編寫文件server,內容為:

service server
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /home/test/server (此處設置成自己程序所在的目錄)
}

如果使用的是較早版本,則需在/etc/inetd.conf文件中添加下面的行:

server tcp nowait root /path/to/yourdirectory/server

(3)執行/etc/rc.d/initd.d/xinetd restart重新啟動xinetd伺服器。早期版本執行/etc/rc.d/initd.d/inetd restart重新啟動inetd。

(4)執行netstat -an查看有沒有server程序使用的埠號,如果有就可使用下面客戶機程序進行測試了。

客戶機程序

下面就客戶機函數做一簡單介紹。

//程序名client.c
/*功能:從客戶的控制台輸入一個字元,然後將這個字元送到伺服器,並將伺服器返回的字元顯示出來*/
#include "sys/types.h"
#include "sys/socket.h"
#include "stdio.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "unistd.h"
int main()
{
int sockfd;//
int address_len;
int connect_flag;
struct sockaddr_in address;
int connect_result;
char client_ch,server_ch;

函數socket()用於建立一個套介面,創建成功返回套介面描述符。

sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf(「sockfd error /n」);
}
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(「192.168.0.1」);/*讀者根據自己環境改成伺服器地址*/
address.sin_port=htons(9000);

address_len=sizeof(address);

函數connect()用於與伺服器建立一個主動連接,調用成功返回值為0。

connect_flag=connect(sockfd,(struct sockaddr *)&address,address_len);

if(connect_flag==-1)
{
perror(「client」);
exit(1);
}
printf(「Input a character :」);

函數scanf()用於從控制台輸入一個字元,並將字元存入client_ch的地址。函數write()和read()用於傳輸數據。函數printf()在客戶機屏幕上顯示伺服器傳回的字元。函數close()關閉套介面。

scanf(「%c」,&client_ch);
write(sockfd,&client_ch,1);
read(sockfd,&server_ch,1);
printf(「character from server : %c/n」,server_ch);
close(sockfd);
exit(0);
}

執行命令「gcc -o client client.c」,將client.c編譯成client。執行「./client」,在程序提示下輸入一個字元,就能看到伺服器傳回的字元。

以上介紹的僅是簡單的例子。平時見到的服務程序遠比它復雜,而且很多是多協議服務程序或是多協議多服務程序。多協議服務程序就是在main()中分別創建供服務的TCP和UDP套介面。為每個服務分別寫出相應程序好處是便於控制,但是這樣每個服務都啟動兩個伺服器,而它們的演算法響應是一樣的,就要耗費不必要的資源,並且出了問題排錯也較困難。多服務是將不同的服務集成在一起由一個程序完成,可用一個數組表示服務,數組中的每一項表示某協議某服務的一種,這樣很容易擴展程序的服務功能。

㈢ Linux怎樣創建FTP伺服器

1.在創建FTP伺服器之有先命令:ps -ef |grep vsftpd,查一下系統有沒有安裝vsftpd這個伺服器,如果出現如下圖所示的界面說明沒有安裝。

㈣ 要想建立一個linux系統的伺服器,最基本的需要知道些什麼知識

搭個smb伺服器,ftp伺服器,squid伺服器

㈤ linux系統可以搭建哪些服務

1、搭建telnet伺服器
2、搭建DHCP伺服器
3、搭建DNS伺服器
4、搭建sendmail伺服器
5、搭建FTP伺服器
6、搭建web伺服器 安裝 apache tomcat
7、搭建samba伺服器
8 sendmail 郵件伺服器

㈥ 怎麼進行Linux平台下的系統及基礎服務的搭建與維護

使用虛擬化內核,或者使用帶遠程管理的網卡,Linux服務也是企業的核心任務之一,如何搭建穩定可靠的伺服器,這是需要我們持續學習的。因此我給你推薦一本實戰型書籍《linux就該這么學》。關於linux服務的部署和linux服務優化,相信你會喜歡。

㈦ linux系統下如何建DDNS服務

linux系統下搭建DDNS服務
記住把 dhcp 和 bind, bind-utils 裝上就行了。
配置:
一 生成密鑰
# dnssec-keygen -a HMAC-MD5 -b 128 -n USER DHCP_UPDATER
這時當前目錄下會生成Kdhcp_updater.+xxx+xxxxx.key及.private兩個文件
# cat Kdhcp_updater.+xxx+xxxxx.key
DHCP_UPDATER. IN KEY 0 2 157 qSSpjerAuaPE/X3JJyxSww==
其中qSSpjerAuaPE/X3JJyxSww==下面要用到的。
參數說明:
上述dnssec-keygen命令的功能就是生成更新密鑰,其中參數-a HMAC-MD5是指密鑰的生成演算法採用HMAC-MD5;參數-b 128是指密鑰的位數為128位;參數-n USER DHCP_UPDATER是指密鑰的用戶為DHCP_UPDATER
二、DHCP的配置:
配置DHCP server 時很簡單,可以參考 /usr/share/doc/dhcp-x.xx/dhcpd.conf.sample來做。也可以先把這個文件cp 到 /etc/dhcpd.conf,然後根據自己的需要做適當修改。下面貼出我的一個/etc/dhcpd.conf,供大家參考:
ddns-update-style interim;
ignore client-updates;
max-lease-time 604800;
default-lease-time 86400;
key DHCP_UPDATER {
algorithm HMAC-MD5;
secret qSSpjerAuaPE/X3JJyxSww==;
};
zone shcto.com. {
primary 127.0.0.1;
key DHCP_UPDATER;
}
zone 160.230.10.in-addr.arpa. {
primary 127.0.0.1;
key DHCP_UPDATER;
}
subnet 10.230.160.0 netmask 255.255.255.0 {
range 10.230.160.30 10.230.160.230;
# --- default gateway
option routers 10.230.160.254;
option subnet-mask 255.255.255.0;
option broadcast-address 10.230.160.255;
# --- option nis-domain "domain.org";
option domain-name "shcto.com";
option domain-name-servers 10.230.128.33,10.230.128.34;
}
幾個要注意的地方:
1. 'ddns-update-style'
這個就是動態DNS的更新方式,有幾個選項,我用的是interim,可以用 man dhcpd.conf找到另外的幾個選項。
2. 'ignore client-updates'
這個選項是不允許客戶機更新DNS記錄。當然,也可能允許,但會有一點問題。
3. 'key DHCP_UPDATER'
這個是更新DNS的KEY,是必須的。其中algorithm 後的是生成key的演算法,key的生成是用 'dnssec-keygen -a HMAC-MD5 -b 128 -n USER DHCP_UPDATER'。
4. 'zone'
要更新的zone,如果是本機就是DNS server,primay 就寫127.0.0.1,要是其它機器是DNS server, 就寫那台機器的IP。
別的都是一般DNS該有的了,要注意的是一定要有 range 那一行,不然就分不了IP啦。
配好以後,可以啟動一下試試, service dhcpd start,如果沒問題,把dhcpd改成開機就啟動,chkconfig --level 2345 dhcpd on。
三、bind(named)的配置。
# rpm -qa | gerp bind
看有沒有bind-xx及bind-chroot-xx理論上chroot可以提高安全性但設置時繁瑣一點
# rpm -qa | gerp caching-name
看caching-nameserver是否也已經裝了,這個不裝的話就要自己寫named.ca等幾個文件了

######################3named.conf參考範例:
// generated by named-bootconf.pl
options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
forward first;
forwarders { 202.99.224.8; 202.99.224.67; 202.106.0.20; };

// query-source address * port 53;
};
//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
key DHCP_UPDATER {
algorithm HMAC-MD5;
secret qSSpjerAuaPE/X3JJyxSww==;
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
zone "160.230.10.in-addr.arpa" IN {
type master;
file "named.160.230.10";
allow-update { key DHCP_UPDATER; };
};
zone "shcto.com" IN {
type master;
file "named.shcto.com";
allow-update { key DHCP_UPDATER; };
};
include "/etc/rndc.key";
/var/named/
區域文件
$TTL 86400
$ORIGIN shcto.com.
@ IN SOA NS1.shcto.com. root.NS1.shcto.com. (
2007121001;
28800;
14400;
3600000;
86400);
IN NS NS1.shcto.com.
IN MX 0 mail.shcto.com.
mail IN A 10.230.129.40
webserver IN A 10.230.128.36
www IN CNAME webserver
smbserver IN A 10.230.128.33
ftp IN CNAME smbserver
named.128.230.10
$TTL 86400
@ IN SOA NS1.shcto.com. root.mail.shcto.com.(
2007121001;
28800;
14400;
3600000;
86400);
IN NS NS1.shcto.com.
40 IN PTR mail.shcto.com.
33 IN PTR smbserver.shcto.com.
80 IN PTR webserver.shcto.com.

其中多了的是
key DHCP_UPDATER {
algorithm HMAC-MD5;
secret qhB++OR5yWo8BTXwk/m4ng;
};
這就是更新dns要用的key,必須和dhcpd.conf里的一樣。
還有就是每個 zone 都可以用 key 來update了。
這樣就行了。然後啟動一下試試吧。
你就可以ping 機器名來找你同事的機器了。

四。測試(主要講講LINUX)
在客戶機上加入一個文件/etc/dhclient.conf內容如下
send fqdn.fqdn "test"; //test為本機的hostname
send fqdn.encoded on;
send fqdn.server-update off;
運行dhclient或重新啟動
正常的話DNS伺服器主機的/var/named/chroot/var/named下會多出一個以jnl結尾的

閱讀全文

與linux創建系統服務相關的資料

熱點內容
怎麼樣搭建源碼網站 瀏覽:424
新概念四冊pdf 瀏覽:361
怎麼下載悅虎檢測app 瀏覽:528
cad表達式命令 瀏覽:198
程序員去一個小公司值不值得 瀏覽:846
程序員做個程序多少錢 瀏覽:495
win10原始解壓軟體 瀏覽:319
阿里程序員的老家 瀏覽:258
量子加密銀行 瀏覽:193
命令方塊獲得指令手機 瀏覽:499
學習結束感言簡短程序員 瀏覽:398
android關機鬧鍾實現 瀏覽:968
滑鼠一鍵打開文件夾設置 瀏覽:161
程序員看過來我想靜靜搞笑視頻 瀏覽:370
curlphp爬蟲 瀏覽:874
python按日期循環 瀏覽:110
php三個等號 瀏覽:760
培訓班出來的程序員解決問題很差 瀏覽:963
程序員那麼可愛25集 瀏覽:753
伺服器地址和ip地址一樣不 瀏覽:664