把linux可執(zhí)行程序做成一個(gè)服務(wù)
在linux系統(tǒng)啟動(dòng)的時(shí)候,我們可以看到很多服務(wù)性程序一個(gè)接一個(gè)的被啟動(dòng)(就是那些后面有一個(gè)蘭色[OK]的行),這些在后臺(tái)運(yùn)行的程序?yàn)槲覀兪褂糜?jì)算機(jī)起了很重要的作用,以這種方式運(yùn)行的程序有以下特點(diǎn):
開機(jī)啟動(dòng),關(guān)機(jī)停止(廢話!關(guān)機(jī)了還運(yùn)行啊???)
后臺(tái)運(yùn)行
通過service 命令控制或查看對(duì)應(yīng)的程序的運(yùn)行狀態(tài)
恩,不錯(cuò),那怎么把我們自己編制的程序做成這樣的一個(gè)服務(wù)呢?
廢話少說,主要分以下3步:
1、把可執(zhí)行程序放到一個(gè)linux系統(tǒng)可以找到的地方。
在linux命令提示符下輸入env ,回車后可看到環(huán)境變量,里面有一項(xiàng)PATH的,對(duì),這項(xiàng)里所指定的目錄都是系統(tǒng)可找到的地方,把我們的可執(zhí)行程序放入其中的一個(gè)目錄下即可,我們一般放在/usr/sbin/目錄下(放什么有放什么的地方,最好不要亂放)。
2、在目錄 /etc/init.d/ 下,新建一個(gè)以服務(wù)名為文件名的文件。
如果我們打開目錄 /etc/init.d/,看到的文件其實(shí)都是服務(wù)程序文件,每個(gè)文件的內(nèi)容都大同小異,我們會(huì)看到,這里的文件在文件結(jié)構(gòu)上幾乎是一樣的。幾乎每個(gè)文件都有 start、stop、restart和status這樣的標(biāo)志,對(duì),我們新建的這個(gè)文件也具有相同的結(jié)構(gòu),只是在這些標(biāo)志內(nèi)部把相應(yīng)的可執(zhí)行程序換成我們自己的可執(zhí)行程序即可,知道怎么做了嗎?那就是:復(fù)制——修改——保存。
3、在目錄 /etc/rc3.d/ 下,新建一個(gè)指向在第2步中建立的服務(wù)文件的符號(hào)連接文件。
打開目錄 /etc/rc3.d/ ,我們將看到這里都是符號(hào)連接文件(linux系統(tǒng)中的符號(hào)連接相當(dāng)于windows中的快捷方式)。采用以下命令格式:
ln -sf 目標(biāo)文件名 連接文件名
連接文件名稱采用“SXX目標(biāo)文件名”的格式,其中XX一般是一個(gè)從1到100的整數(shù),它表示啟動(dòng)優(yōu)先級(jí),數(shù)字越大,優(yōu)先級(jí)越低,比如:服務(wù)A的運(yùn)行要依賴服務(wù)B,那A的XX數(shù)字就應(yīng)該大于B的。后跟“目標(biāo)文件名”是為了一目了然,一看就知道是哪個(gè)文件的符號(hào)連接。
目錄 /etc/rc3.d/ 是系統(tǒng)啟動(dòng)時(shí)自動(dòng)搜索的目錄,該目錄下的符號(hào)連接文件的目標(biāo)文件,都將被運(yùn)行,這就是在這個(gè)目錄建立符號(hào)連接的原因——為了開機(jī)就運(yùn)行。
好了,完成以上3個(gè)步驟,你就把自己的一個(gè)可執(zhí)行程序做成系統(tǒng)的一個(gè)服務(wù)了,它具有我們一開始說的幾個(gè)特定。我們可以用service命令控制這個(gè)程序了:
啟動(dòng):service hdz_service start
停止:service hdz_service stop
重啟:service hdz_service restart
上面的 hdz_service 為服務(wù)名,也就是在第2步中建立的文件名。
不過,好象感覺比較麻煩,能否把這幾個(gè)步驟自動(dòng)化一下?這樣在一臺(tái)新機(jī)子上部署就方便了,也更象回事 -_^!辦法當(dāng)然有了,還記得我們那個(gè)記錄代碼文件之間依賴關(guān)系的makefile文件嗎?呵呵,我們?cè)谶@里要用到它了。
在makefile文件中添加一個(gè)標(biāo)志,并在該標(biāo)志下添加和下面類似的代碼:
install:
cp ./hdz_pro /usr/sbin/
cp ./hdz_service /etc/init.d/
cd /etc/init.d/
chmod +x hdz_service
cd /etc/rc3.d/
ln -sf ../init.d/hdz_service ./S99hdz_service
在標(biāo)志install下的沒一句話,前面一定要留空白,這不僅是有利于閱讀,更是一個(gè)要求,makefile文件要求每一句可執(zhí)行語句前都要有空白(空格或tab)。
上面代碼中的 hdz_pro 和 hdz_service 分別是可執(zhí)行文件名和服務(wù)名,這兩個(gè)名稱換成你自己的就行了,操作時(shí)用以下命令:
make install
運(yùn)行完就一切OK了,簡(jiǎn)單吧?
大家在看我寫的東東時(shí),時(shí)不時(shí)會(huì)碰到“hdz”這樣的東西,這是我名字的縮寫,說明這正是要替換的。
-----------------------------------------------------
一般系統(tǒng)的運(yùn)行級(jí)別是在 /etc/inittab 里面指定的。有一行是類似
id:5:initdefault:
或者
id:3:initdefault:
的,這里的數(shù)字就是系統(tǒng)的默認(rèn)運(yùn)行級(jí)別。假設(shè)是 5。
啟動(dòng)服務(wù)的是依靠 /etc/init.d/ 下的腳本啟動(dòng)的。這些都是普通的 shell 腳本,系統(tǒng)在調(diào)用的時(shí)候,如果是啟動(dòng)服務(wù),則傳入 start 作為參數(shù);stop 表示停止;restart 表示重啟。因此你可以寫一個(gè)腳本,比如簡(jiǎn)單的如這樣:
#!/bin/sh
ARG=$1
case $ARG in
start):
nohup /path/to/your/program &
;;
stop):
pkill program
;;
restart):
pkill program
nohup /path/to/your/program &
;;
esac
把這個(gè)腳本放在 /etc/init.d 里面,譬如 /etc/init.d/your_prog
然后加入相應(yīng)運(yùn)行級(jí)別的鏈接:在 5 級(jí)啟動(dòng)則
ln -s /etc/init.d/your_prog /etc/rc5.d/S100your_prog
ln -s /etc/init.d/your_prog /etc/rc0.d/K100your_prog
這里兩個(gè)數(shù)字都可以用對(duì)應(yīng)目錄里最大的數(shù)字,因?yàn)闆]有別的服務(wù)依賴你的服務(wù)。
這樣表示,當(dāng)系統(tǒng)進(jìn)入 init level 5 的時(shí)候啟動(dòng)你的程序,進(jìn)入 init level 0 的時(shí)候停止你的程序。
----------------------------------------------------------
系統(tǒng)服務(wù)介紹1. alsasound :Alsa聲卡驅(qū)動(dòng)守護(hù)程序。
2. acpid:acpid(Advanced Configuration and Power Interface)是為替代傳統(tǒng)的APM電源管理標(biāo)準(zhǔn)而推出的新型電源管理標(biāo)準(zhǔn)。通常筆記本電腦需要啟動(dòng)電源進(jìn)行管理。
3. atalk:AppleTalk網(wǎng)絡(luò)守護(hù)進(jìn)程。
4. amd: 自動(dòng)安裝NFS守護(hù)進(jìn)程。
5. anacron:一個(gè)自動(dòng)化運(yùn)行任務(wù)守護(hù)進(jìn)程。
6. apmd:apmd(Advanced Power Management)是高級(jí)電源管理。
7. arptables_jf :為arptables網(wǎng)絡(luò)的用戶控制過濾的守護(hù)進(jìn)程。
8. arpwatch: 記錄日志并構(gòu)建一個(gè)在LAN接口上看到的以太網(wǎng)地址和IP地址對(duì)數(shù)據(jù)庫。
9. autofs:自動(dòng)安裝管理進(jìn)程automount,與NFS相關(guān),依賴于NIS服務(wù)器。
10. bootparamd:引導(dǎo)參數(shù)服務(wù)器,為L(zhǎng)AN上的無盤工作站提供引導(dǎo)所需的相關(guān)信息。
11. bluetooch:藍(lán)牙服務(wù)器守護(hù)進(jìn)程。
12. crond :cron是Unix下的一個(gè)傳統(tǒng)程序,該程序周期地運(yùn)行用戶調(diào)度的任務(wù)。比起傳統(tǒng)的Unix版本,Linux版本添加了不少屬性,而且更安全,配置更簡(jiǎn)單。類似計(jì)劃任務(wù)。
13. chargen:使用tcp協(xié)議的chargen server,chargen(Character Generator Protocol)是一種網(wǎng)絡(luò)服務(wù),主要功能是提供類似遠(yuǎn)程打字的功能。
14. chargen-udp:使用UDP協(xié)議的chargen server。
15. cpuspeed:監(jiān)測(cè)系統(tǒng)空閑百分比,降低或加快CPU時(shí)鐘速度和電壓從而在系統(tǒng)空閑時(shí)將能源消耗降為最小,而在系統(tǒng)繁忙時(shí)最大化加快系統(tǒng)執(zhí)行速度。
16. dhcpd:動(dòng)態(tài)主機(jī)控制協(xié)議(Dynamic Host Control Protocol)的服務(wù)守護(hù)進(jìn)程。
17. cups: cups(Common UNIX Printing System)是通用UNIX打印守護(hù)進(jìn)程。
18. cups-config-daemons:cups打印系統(tǒng)切換守護(hù)進(jìn)程。
19. cups-lpd:cups行打印守護(hù)進(jìn)程。
20. daytime:使用TCP 協(xié)議的Daytime守護(hù)進(jìn)程,該協(xié)議為客戶機(jī)實(shí)現(xiàn)從遠(yuǎn)程服務(wù)器獲取日期和時(shí)間的功能。預(yù)設(shè)端口:13。
21. daytime-udp:使用UDP 協(xié)議的Daytime守護(hù)進(jìn)程。
22. dc_server:使用SSL安全套接字的代理服務(wù)器守護(hù)進(jìn)程。
23. dc_client:使用SSL安全套接字的客戶端守護(hù)進(jìn)程。
24. diskdump:服務(wù)器磁盤備份守護(hù)進(jìn)程。
25. echo:服務(wù)器回顯客戶數(shù)據(jù)服務(wù)守護(hù)進(jìn)程。
26. echo-udp:使用UDP協(xié)議的服務(wù)器回顯客戶數(shù)據(jù)服務(wù)守護(hù)進(jìn)程。
27. eklogin:接受rlogin會(huì)話鑒證和用kerberos5加密的一種服務(wù)的守護(hù)進(jìn)程。
28. gated :網(wǎng)關(guān)路由守護(hù)進(jìn)程。它支持各種路由協(xié)議,包括RIP版本1和2、DCN HELLO協(xié)議、 OSPF版本2以及EGP版本2到4。
29. gpm:gpm(General Purpose Mouse Daemon )守護(hù)進(jìn)程為文本模式下的Linux程序如mc(Midnight Commander)提供了鼠標(biāo)的支持。
30. gssftp: 使用kerberos 5認(rèn)證的ftp守護(hù)進(jìn)程
31. httpd:Web服務(wù)器Apache守護(hù)進(jìn)程。
32. inetd :因特網(wǎng)操作守護(hù)程序。
33. innd:Usenet新聞服務(wù)器守護(hù)進(jìn)程。
34. iiim:中文輸入法服務(wù)器守護(hù)進(jìn)程。
35. iptables:iptables防火墻守護(hù)進(jìn)程。
36. irda:紅外端口守護(hù)進(jìn)程。
37. isdn:isdn啟動(dòng)和中止服務(wù)守護(hù)進(jìn)程。
38. krb5-telnet:使用kerberos 5認(rèn)證的telnet守護(hù)進(jìn)程。
39. klogin:遠(yuǎn)程登陸守護(hù)進(jìn)程。
40. keytable:該進(jìn)程的功能是轉(zhuǎn)載在/etc/sysconfig/keyboards里定義的鍵盤映射表,該表可以通過kbdconfig工具進(jìn)行選擇。您應(yīng)該使該程序處于激活狀態(tài)。
41. irqbalance:對(duì)多個(gè)系統(tǒng)處理器環(huán)境下的系統(tǒng)中斷請(qǐng)求進(jìn)行負(fù)載平衡的守護(hù)程序。如果你只安裝了一個(gè)CPU,就不需要加載這個(gè)守護(hù)程序。
42. kshell :kshell守護(hù)進(jìn)程。
43. kudzu:硬件自動(dòng)檢測(cè)程序。
44. ldap:ldap(Lightweight Directory Access Protocol)目錄訪問協(xié)議服務(wù)器守護(hù)進(jìn)程。
45. lm_seroems:檢測(cè)主板工作情況守護(hù)進(jìn)程。
46. lpd :lpd是老式打印守護(hù)程序,負(fù)責(zé)將lpr等程序提交給打印 作業(yè)。
47. mdmonitor:RAID相關(guān)設(shè)備的守護(hù)程序。
48. messagebus:D-BUS是一個(gè)庫,為兩個(gè)或兩個(gè)以上的應(yīng)用程序提供一對(duì)一的通訊。
49. microcode_ctl:可編碼以及發(fā)送新的微代碼到內(nèi)核以更新Intel IA32系列處理器。
50. mysqld: 一個(gè)快速高效可靠的輕型SQL數(shù)據(jù)庫引擎守護(hù)進(jìn)程。
51. named:DNS(BIND)服務(wù)器守護(hù)進(jìn)程。
52. netplugd:netplugd(network cable hotplug management daemon)守護(hù)程序,用于監(jiān)控一個(gè)或多個(gè)網(wǎng)絡(luò)接口的狀態(tài),當(dāng)某些事件觸發(fā)時(shí)運(yùn)行一個(gè)外部腳本程序。
53. netdump:遠(yuǎn)程網(wǎng)絡(luò)備份服務(wù)器守護(hù)進(jìn)程。
54. netfs:Network Filesystem Mounter,該進(jìn)程安裝和卸載NFS、SAMBA和NCP網(wǎng)絡(luò)文件系統(tǒng)。
55. nfs:網(wǎng)絡(luò)文件系統(tǒng)守護(hù)進(jìn)程。
56. nfslock:NFS是一個(gè)流行的通過TCP/IP網(wǎng)絡(luò)共享文件的協(xié)議,此守護(hù)進(jìn)程提供了NFS文件鎖定功能。
57. ntpd:Network time Protocol daemon(網(wǎng)絡(luò)時(shí)間校正協(xié)議)。ntpd是用來使系統(tǒng)和一個(gè)精確的時(shí)間源保持時(shí)間同步的協(xié)議守護(hù)進(jìn)程。
58. network:激活/關(guān)閉啟動(dòng)時(shí)的各個(gè)網(wǎng)絡(luò)接口守護(hù)進(jìn)程。
59. psacct:該守護(hù)進(jìn)程包括幾個(gè)工具用來監(jiān)控進(jìn)程活動(dòng)的工具,包括ac,lastcomm, accton 和sa。
60. pcmcia:主要用于支持筆記本電腦接口守護(hù)進(jìn)程。
61. portmap:該守護(hù)進(jìn)程用來支持RPC連接,RPC被用于NFS以及NIS 等服務(wù)。
62. postgresql: PostgreSQL 關(guān)系數(shù)據(jù)庫引擎。
63. proftpd: proftpd 是Unix下的一個(gè)配置靈活的ftp服務(wù)器的守護(hù)程序。
64. pppoe:ADSL連接守護(hù)進(jìn)程。
65. random :保存和恢復(fù)系統(tǒng)的高質(zhì)量隨機(jī)數(shù)生成器,這些隨機(jī)數(shù)是系 統(tǒng)一些隨機(jī)行為提供的。
66. rawdevices:在使用集群文件系統(tǒng)時(shí)用于加載raw設(shè)備的守護(hù)進(jìn)程。
67. readahead、readahead_early:readahead和readahead_early是在Fedora core 2中最新推出的兩個(gè)后臺(tái)運(yùn)行的守護(hù)程序。其作用是在啟動(dòng)系統(tǒng)期間,將啟動(dòng)系統(tǒng)所要用到的文件首先讀取到內(nèi)存中,然后在內(nèi)存中進(jìn)行執(zhí)行,以加快系統(tǒng)的啟動(dòng)速度。
68. rhnsd:Red Hat 網(wǎng)絡(luò)服務(wù)守護(hù)進(jìn)程。通知官方的安全信息以及為系統(tǒng)打補(bǔ)丁。
69. routed :該守護(hù)程序支持RIP協(xié)議的自動(dòng)IP路由表維護(hù)。
70. rsync:remote sync遠(yuǎn)程數(shù)據(jù)備份守護(hù)進(jìn)程。
71. rsh :遠(yuǎn)程主機(jī)上啟動(dòng)一個(gè)shell,并執(zhí)行用戶命令。
72. rwhod: 允許遠(yuǎn)程用戶獲得運(yùn)行rwho守護(hù)程序的機(jī)器上所有已登錄用戶的列表。
73. rstatd:一個(gè)為L(zhǎng)AN上的其它機(jī)器收集和提供系統(tǒng)信息的守候進(jìn)程。
74. ruserd:遠(yuǎn)程用戶定位服務(wù),這是一個(gè)基于RPC的服務(wù),它提供關(guān)于當(dāng)前記錄到LAN上一個(gè)機(jī)器日志中的用戶信息
75. rwalld:激活rpc.rwall服務(wù)進(jìn)程,這是一項(xiàng)基于RPC的服務(wù),允許用戶給每個(gè)注冊(cè)到LAN機(jī)器上的其他終端寫消息。
76. rwhod:激活rwhod服務(wù)進(jìn)程,它支持LAN的rwho和ruptime服務(wù)。
77. saslauthd: 使用SASL的認(rèn)證守護(hù)進(jìn)程。
78. sendmail:郵件服務(wù)器sendmail守護(hù)進(jìn)程。
79. smb:Samba文件共享/打印服務(wù)守護(hù)進(jìn)程。
80. snmpd:本地簡(jiǎn)單網(wǎng)絡(luò)管理守護(hù)進(jìn)程。
81. squid:代理服務(wù)器squid守護(hù)進(jìn)程。
82. sshd:OpenSSH服務(wù)器守護(hù)進(jìn)程。Secure Shell Protocol可以實(shí)現(xiàn)安全地遠(yuǎn)程管理主機(jī)。
83. smartd:Self Monitor Analysis and Reporting Technology System,監(jiān)控你的硬盤是否出現(xiàn)故障。
84. syslog:一個(gè)讓系統(tǒng)引導(dǎo)時(shí)起動(dòng)syslog和klogd系統(tǒng)日志守候進(jìn)程的腳本。
85. time :該守護(hù)進(jìn)程從遠(yuǎn)程主機(jī)獲取時(shí)間和日期,采用TCP協(xié)議。
86. time-udp: 該守護(hù)進(jìn)程從遠(yuǎn)程主機(jī)獲取時(shí)間和日期,采用UDP協(xié)議。
87. tux:在Linux內(nèi)核中運(yùn)行apache服務(wù)器的守護(hù)進(jìn)程。
88. vsftpd:vsftpd服務(wù)器的守護(hù)進(jìn)程。
89. vncserver: VNC (Virtual Network Computing,虛擬網(wǎng)絡(luò)計(jì)算)。
90. xfs:X Window字型服務(wù)器守護(hù)進(jìn)程,為本地和遠(yuǎn)程X服務(wù)器提供字型集。
91. xinetd:支持多種網(wǎng)絡(luò)服務(wù)的核心守護(hù)進(jìn)程。
92. ypbind:為NIS(網(wǎng)絡(luò)信息系統(tǒng))客戶機(jī)激活ypbind服務(wù)進(jìn)程 。
93. yppasswdd:NIS口令服務(wù)器守護(hù)進(jìn)程。
94. ypserv:NIS主服務(wù)器守護(hù)進(jìn)程。
95. yum:RPM操作系統(tǒng)自動(dòng)升級(jí)和軟件包管理守護(hù)進(jìn)程。
可以根據(jù)自己的需要覺得是否啟動(dòng)某系服務(wù)。如:u、iptables等是必須要運(yùn)行的。echo、echo-udp、daytime、daytime- udp、chargen、chargen -udp做調(diào)試用可以關(guān)閉。rsh、rstatd、rsync、rusersd、rwalld這些命令都是Berkley遠(yuǎn)程命令,因?yàn)槎家宰帜竢開頭,故稱 r*命令。主要使用來使一臺(tái)計(jì)算機(jī)上的某個(gè)用戶以相同的帳戶遠(yuǎn)程執(zhí)行另一臺(tái)計(jì)算機(jī)的一個(gè)程序,不要可以關(guān)閉,減少隱患。innd是運(yùn)行新聞組服務(wù)的進(jìn)程,不要可以關(guān)閉。
----------------------------------------------------------
nohup是告訴系統(tǒng)忽略用戶退出系統(tǒng)
讓進(jìn)程運(yùn)行直到進(jìn)程結(jié)束為止
比如我在遠(yuǎn)程打開ssh終端運(yùn)行程序./server
如果不用nohup當(dāng)我關(guān)閉ssh終端時(shí)
./server進(jìn)程將會(huì)中止
使用nohup ./server &
可以在用戶退出終端時(shí)
進(jìn)程能繼續(xù)執(zhí)行